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 使用场景

  • @InjectJSR330 (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方法上。
posted @ 2019-09-09 15:37  雪域熊猫  阅读(237)  评论(0编辑  收藏  举报