annotation之@Autowired、@Inject、@Resource三者区别
1. @Autowired
@Autowired
使用场景
@Autowired
是spring自带的注解,通过AutowiredAnnotationBeanPostProcessor
类实现的依赖注入;@Autowired
是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier
;@Autowired
有个属性为required
,可以配置为false
,如果配置为false
之后,当没有找到相应 bean 的时候,系统不会抛错;@Autowired
可以作用在变量、setter方法、构造函数上。
@Qualifier
注解
@Qualifier("XXX")
中的 XX 是 Bean 的名称,所以@Autowired
和@Qualifier
结合使用时,自动注入的策略就从 byType 转变成 byName 了。- 需要注意的是
@Autowired
可以对成员变量、方法以及构造函数进行注释,而@Qualifier
的标注对象是成员变量、方法入参、构造函数入参。
@Primary
注解
- 将同一个 Class 的某个实现类设置为首选
- 当一个类的两个实现都被扫描到,并且以 byType 方式注入时,Spring将报出以下错误
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.test.Singer] is defined: expected single matching bean but found 2: oneSinger, twoSinger
- 此时可以使用
@Qualifier
注解按名称注入 - 使用
@Primary
处理冲突
将某个实现类加上@Primary
注解,此时Spring容器可以使用 byType 的方式注入@Primary
描述过的实现类,不再会报NoUniqueBeanDefinitionException
的异常。
2. @Inject
@Inject
使用场景
@Inject
是 JSR330 (Dependency Injection for Java) 中的规范,需要导入javax.inject.Inject
实现注入。@Inject
是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Named
;@Inject
可以作用在变量、setter方法、构造函数上,此时和@Autowired
一样
@Name
注解
@Named("XXX")
中的 XX 是 Bean 的名称,所以@Inject
和@Named
结合使用时,自动注入的策略就从 byType 转变成 byName 了。
3. @Resource
@Resource
是JSR250规范的实现,需要导入javax.annotation
实现注入;@Resource
是根据名称进行自动装配的,一般会指定一个name属性;@Resource
可以作用在变量、setter方法上。