首页 > 其他分享 >8、Spring之基于注解的自动装配

8、Spring之基于注解的自动装配

时间:2023-08-06 19:23:23浏览次数:33  
标签:装配 userService Autowired Spring org bean 注解 UserService public

8.1、场景模拟

8.1.1、UserDao接口及实现类

image

package org.rain.spring.dao;

/**
 * @author liaojy
 * @date 2023/8/5 - 18:32
 */
public interface UserDao {

    void saveUser();

}

image

package org.rain.spring.dao.impl;

import org.rain.spring.dao.UserDao;
import org.springframework.stereotype.Repository;

/**
 * @author liaojy
 * @date 2023/8/5 - 18:33
 */
@Repository
public class UserDaoImpl implements UserDao {
    public void saveUser() {
        System.out.println("保存成功");
    }
}

8.1.2、UserService接口及实现类

image

package org.rain.spring.service;

/**
 * @author liaojy
 * @date 2023/8/5 - 18:35
 */
public interface UserService {

    void saveUser();

}

image

package org.rain.spring.service.impl;

import org.rain.spring.dao.UserDao;
import org.rain.spring.service.UserService;
import org.springframework.stereotype.Service;

/**
 * @author liaojy
 * @date 2023/8/5 - 18:36
 */
@Service
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void saveUser() {
        userDao.saveUser();
    }

}

8.1.3、UserController

image

package org.rain.spring.controller;

import org.rain.spring.service.UserService;
import org.springframework.stereotype.Controller;

/**
 * @author liaojy
 * @date 2023/8/5 - 18:38
 */
@Controller("myUserController")
public class UserController {

    private UserService userService;

    public void saveUser(){
        userService.saveUser();
    }

}

8.1.4、bean配置

image

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--
        对指定的package进行扫描,将使用组件注解的类的对象,交给spring的ioc容器来管理
    -->
    <context:component-scan base-package="org.rain.spring"></context:component-scan>

</beans>

8.1.5、测试

image

由控制台日志可知,组件注解+组件扫描,存在尚未实现依赖注入的问题

    @Test
    public void testAutowireByAnnotation(){

        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");
        UserController userController = ioc.getBean(UserController.class);
        userController.saveUser();

    }

8.2、@Autowired注解

@Autowired:实现自动装配功能的注解,其能够标识的位置有三处

8.2.1、方式一:标识在成员变量上(常用)

image

    @Autowired
    private UserDao userDao;

image

    @Autowired
    private UserService userService;

image

8.2.2、方式二:标识在setter方法上

image

    private UserDao userDao;

    @Autowired
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

image

    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

image

8.2.3、方式三:标识在有参构造方法上

image

    private UserDao userDao;

    @Autowired
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

image

    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

image

8.3、@Autowired的工作流程

  • 默认通过byType的方式,在IOC容器中匹配类型相同的bean,为属性赋值

  • 如果有多个类型匹配的bean,则自动转换为通过byName的方式,在IOC容器中匹配id和属性名相同的bean,为属性赋值

  • 如果有多个类型匹配的bean,且在IOC容器中没有找到id和属性名相同的bean;
    则可以使用@Qualifier注解指定某个bean的id,将这个bean赋值给属性

image

如果有多个类型匹配的bean,且在IOC容器中没有找到id和属性名相同的bean,也没有使用@Qualifier注解指定将某个bean赋值给属性;则会抛出异常NoUniqueBeanDefinitionException

    @Autowired
    @Qualifier("myUserService")
    private UserService userService;

8.4、@Autowired的注意事项

在@Autowired注解中有一个属性required,默认值为true,意思是必要完成自动装配

如果在IOC容器中没有匹配的bean,就会抛出异常NoSuchBeanDefinitionException

为此可以将required属性的值设置为false,这样能装配就装配,不能装配就使用默认值

image

一般可以通过排查组件注解、组件扫描和@Qualifier注解,定位出为什么在IOC容器中没有匹配的bean

    @Autowired(required = false)
    private UserService userService;

标签:装配,userService,Autowired,Spring,org,bean,注解,UserService,public
From: https://www.cnblogs.com/Javaer1995/p/17609457.html

相关文章

  • 【springBoot】搭建多模块项目指南
    二、多环境配置内容①在reources目录下建立多个配置文件②在pom.xml配置profile节点③mvn命令行打包命令,基于参数进行打包替换占位符mvn-Ucleaninstall-Dmaven.test.skip=true-Pprod④将target目录下的jar包copy出来,执行命令启动,使用的就是不同环境的配置进行启动的......
  • 基于springboot城市便捷酒店管理系统
    随着科技不断的进步,系统管理也都将通过计算机进行整体智能化操作。对于酒店预订网站所牵扯的管理及数据保存都是非常多的,例如管理员:用户管理、客房管理、栏目管理、内容管理、轮播图管理、订单管理、数据统计等,这给管理者的工作带来了巨大的挑战,面对大量的信息,传统的管理系统,都是通......
  • Spring boot集成Redis
    在开发中,放到缓存中的数据我们都要给过期时间,使其可以在系统即使没有主动更新数据也能自动触发数据加载的流程,避免业务奔溃导致的数据永久不一致的问题1、引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-......
  • spring boot自定义类中 @Autowired注入失败问题小记
    springboot自定义类中@Autowired注入失败问题小记第一种方法:@PostConstruct,大多数人使用的方式,不过对于我的问题没有用第二种方法:实现ApplicationRunner接口,在run方法执行后进行初始化第三种方法:实现ApplicationContextAware接口,直接到spring容器拿bean代码如下shiroConf......
  • Spring 配置 Bean 实例化有哪些方式?
    Allyouneedistheplan,theroadmap,andthecouragetopressontoyourdestination.你所需要的只是计划,路线图,以及朝着目标前进的勇气。Spring实例化bean的方式构造器的方式静态工厂方式实例化工厂方式1、使用构造器实例化bean也是最常用的ps:注意:Hello......
  • VMware vSphere vCenter Server Appliance 7.0安装配置​
    VMwarevSpherevCenterServerAppliance7.0安装配置环境说明:将vCenterServerAppliance部署在ESXi主机上,安装配置虚拟机windows2019:准备好VMwarevCenterServer镜像文件将准备好合适版本的vCenterServer镜像文件的电脑与ESXi主机的连通。注意:vCenter版本要高于ESXi版本,否则......
  • Cannot resolve org.springframework.boot:spring-boot-starter-parent:2.4.3
    环境IDEA:2020-1-3MAVEN:3.6.2Spring-boog:2.3.4问题描述在pom.xml中写入所需依赖后,通过MAVEN加载依赖无法完成,报错异常信息Cannotresolveorg.springframework.boot:spring-boot-starter-parent:2.4.3问题原因应该是本地仓库中有之前由于网速不好未下载完成的文件,M......
  • 记录一下 搭建springboot,springCloud,springCloudAlibaba,nacos
    1,首先创建一个空项目里面有两个服务一个提供者一个调用者 2,父工程的使用依赖 以及springBoot的父依赖//springboot父工程<parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId>......
  • 在 Spring Boot 应用程序中,可以通过命令行参数或环境变量来指定配置文件和日志文件的
    1、使用命令行参数java-jaryour-app.jar--spring.config.location=file:/path/to/application.properties--logging.file=/path/to/logs/your-app.log在上述命令中,--spring.config.location参数用于指定配置文件的位置,--logging.file参数用于指定日志文件的位置。2、使......
  • SpringBoot对接OpenAI
    SpringBoot对接OpenAI随着人工智能技术的飞速发展,越来越多的开发者希望将智能功能集成到自己的应用中,以提升用户体验和应用的功能。OpenAI作为一家领先的人工智能公司,提供了许多先进的自然语言处理和语言生成模型,其中包括深受欢迎的GPT-3.5模型。本文将介绍如何利用SpringBoot框......