@AutoWired与@Qualifier理解

2023-04-25 19:29:47

@AutoWired(自动装配)

常用有两种模式

  1. byName: 根据属性名自动配置
  2. byType: 根据属性类型自动配置(Spring默认)

@AutoWired自动装配默认是按类型匹配的,当且仅有一个匹配的Bean时,spring将其注入到@AutoWired标注的变量中

在ApplicationContext.xml中配置

<!--扫描包-->
<context:component-scan base-package="xxx.xx.xx.XX" />

spring会自动扫描xxx路径下的注解。

//@Autowired注入不需要getter/setter方法
@AutoWired
private UserDao userDao

就去applicationContext.xml下寻找一个userDao的bean

<bean id="userDao" class="com.imooc.dao.UserDao" />

为了配合@AutoWired注解使用,一般不需要去配置bean,而是在需要配置bean的类加上@Component注解,说明当前类是一个bean

@Component("userDao")
public class UserDaoImpl implements UserDao {

    public void addUser() {
        System.out.println("添加用户");
    }
}

有一个细节的问题**:

假如bean里面有两个property,在User类中又去掉了属性的getter/setter并使用@AutoWired注解标注这个属性那会怎么样???

答案是:Spring会按照xml优先的原则去User类中寻找这个两个属性的getter/setter,找不到,导致的结果就是初始化bean报错


@Qualifier(指定注入Bean的名称)

如果一个容器有一个以上的匹配的bean,则可以通过@Qualifier注解准确找指定的Bean

在这里插入图片描述

图中就是UserDao接口有两个实现类,UserDaoImpl和UserDaoImpl2,在用@AutoWired注解的时候,就会遇到这样的困惑,这样注入的是哪个实现类的bean呢,如果不指定注入bean的名称,就会发生错误

//在UserDaoImpl类中
@Component("userDao1")
public class UserDaoImpl implements UserDao {

    public void addUser() {
        System.out.println("添加用户");
    }
}

//在UserDaoImpl2类中
@Component("userDao2")
public class UserDaoImpl2 implements UserDao {
    public void addUser() {
        System.out.println("添加新的学生");
    }
}

//这样配置没指定bean名称是会出错的
	@Autowired
    private UserDao userDao;
//所以要@Qualifier指定bean名称
	@Autowired
    @Qualifier("userDao1")
    private UserDao userDao;

//运行结果
九月 19, 2019 10:22:51 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
添加用户

参考

  • 作者:薯条超人
  • 原文链接:https://blog.csdn.net/weixin_43351375/article/details/101014896
    更新时间:2023-04-25 19:29:47