Autowired和Resource的关系

相同点

都能将 bean 注入到对应的 field 中

@Autowired
private Bean beanA;
@Resource
private Bean beanB;

不同点

  • ByName 和 byType 匹配顺序不同
    1、Autowired在获取bean的时候,先是byType的方式,再是byName的方式。意思就是先在Spring容器中找以Bean为类型的Bean实例,如果找不到或者找到多个bean,则会通过fieldName来找。举个例子:
@Component("beanOne")
class BeanOne implements Bean {}
@Component("beanTwo")
class BeanTwo implements Bean {}
@Service
class Test {
    // 此时会报错,先byType找到两个bean:beanOne和beanTwo
    // 然后通过byName(bean)仍然没办法匹配
	@Autowired
    private Bean bean; 

    // 先byType找到两个bean,然后通过byName确认最后要注入的bean
    @Autowired
    private Bean beanOne;

    // 先byType找到两个bean,然后通过byName确认最后要注入的bean
    @Autowired
    @Qualifier("beanOne")
    private Bean bean;
}

2、Resource 在获取 bean 的时候,和 Autowired 恰好相反,先是 byName 方式,然后再是 byType 方式。当然,我们也可以通过注解中的参数显示指定通过哪种方式。举个例子:

@Component("beanOne")
class BeanOne implements Bean {}
@Component("beanTwo")
class BeanTwo implements Bean {}
@Service
class Test {
    // 此时会报错,先byName,发现没有找到bean
    // 然后通过byType找到了两个Bean:beanOne和beanTwo,仍然没办法匹配
	@Resource
    private Bean bean; 

    // 先byName直接找到了beanOne,然后注入
    @Resource
    private Bean beanOne;

    // 显示通过byType注入,能注入成功
    @Resource(type = BeanOne.class)
    private Bean beanOne;
}
  • 作用域不同
    1、Autowired可以作用在构造器,字段,setter方法上
    2、Resource 只可以使用在 field,setter 方法上
  • 支持方不同
    1、 @Autowired 能够用在:构造器、方法、参数、成员变量和注解上,是 spring 定义的注解。
    2、@Resource 能用在:类、成员变量和方法上,@Resource 是 JSR-250 定义的注解。
  • 使用方式区别
    1、@Autowired 如果要使用 byName,需要使用@Qualifier 一起配合。
    2、@Resource 如果指定了 name,则用 byName 自动装配,如果指定了 type,则用 byType 自动装配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值