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方法上。

浙公网安备 33010602011771号