Spring的@Autowired注入规则

Spring 2.5引入了@Autowired注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。通过@Autowired的使用来消除set,get方法。

@Autowired默认是按照byType进行注入的,但是当byType方式找到了多个符合的bean,又是怎么处理的?

Autowired默认先按byType,如果发现找到多个bean,则,又按照byName方式比对,如果还有多个,则报出异常

例子:

1
2
@Autowired
private ExamUserMapper examUserMapper;  - ExamUserMapper是一个接口
  • spring先找类型为ExamUserMapper的bean
  • 如果存在且唯一,则OK;
  • 如果不唯一,在结果集里,寻找name为examUserMapper的bean。因为bean的name有唯一性,所以,到这里应该能确定是否存在满足要求的bean了

@Autowired也可以手动指定按照byName方式注入,使用@Qualifier标签,例如:

1
2
@Autowired
@Qualifier ( "baseDao" )

因为bean的name具有唯一性,理论上是byName会快一点,但spring默认使用byType的方式注入

要使用@Autowired实现要精简程序的目的,需要这样来处理:

在applicationContext.xml中加入:

1
2
<!-- 该 BeanPostProcessor 将自动对标注 @Autowired 的 Bean 进行注入 -->   
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

Spring通过一个BeanPostProcessor对@Autowired进行解析,所以要让@Autowired起作用必须事先在Spring容器中声明AutowiredAnnotationBeanPostProcessor Bean。

热评文章