SpringBoot注解--03--@Resource与@Autowired用法区别

bean的注入时常用注解

spring中,@Resource和@Autowired都是做bean的注入时使用。使用过程中,有时候@Resource 和 @Autowired可以替换使用;有时,则不可以。

  1. @Autowired
    由spring提供,只按照byType注入

  2. @Resource
    由J2EE提供,默认是按照byName自动注入

  3. @reference
    dubbo框架rpc远程调用时指定注解

@Autowire注解 (默认byType)

@Autowire默认按照类型(by-type)装配,默认情况下要求依赖对象必须存在。

required属性

如果允许依赖对象为null,需设置required属性为false,即

@Autowire(required=false)
private InjectionBean beanName;

@Qualifier注解 (默认byName)

@Autowire
@Qualifier("beanName")
 private InjectionBean beanName;

说明

@Autowire按照名称(by-name)装配,则
@Autowire + @qualifier(“”) = @Resource(name=“”)

@Resource注解

重要属性

  1. @Resource有两个重要的属性,name和type:
  2. 默认按照名称(by-name)装配,名称可以通过name属性指定。

@Resource—4种情况

  • 指定name和type:通过name找到唯一的bean,找不到抛出异常;如果type和字段类型不一致,也会抛出异常
  • 指定name:通过name找到唯一的bean,找不到抛出异常
  • 指定type:通过tpye找到唯一的bean,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException
  • 都不指定:通过字段名作为key去查找,找到则赋值;找不到则再通过字段类型去查找,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException
@Resource(name="bucket")
    private String bucketName;
    
 @Resource(name="style")
    private String styleName;

@Resource与@Autowired用法区别

共同点

@Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。

不同点

  • @Resource
    @Resource是Java自己的注解,@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  • @Autowired
    @Autowired是spring的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。

  1. Resource是JDK提供的,而Autowired是Spring提供的
  2. Resource不允许找不到bean的情况,而Autowired允许(@Autowired(required = false))
  3. 指定name的方式不一样,@Resource(name =“baseDao”),@Autowired()@Qualifier(“baseDao”)
  4. Resource默认通过name查找,而Autowired默认通过type查找

你可能感兴趣的:(Spring基础知识--SSM,spring)