Spring @Autowired和@Resource

@Autowired和@Resource

共同点:都是装配bean的注解

不同点:

@Autowired

提供者:@Autowired是Spring提供的注解

装配方式:ByType(通过类的类型)装配

第一种注入方式

1 // 用于字段上
2 @Autowired
3 private TestDao testDao;

第二种注入方式

1 //同时setter方法注入 
2 //spring boot推荐使用 setter注入
3     @Autowired
4     public void setTestDao (TestDao testDao) {
5        this.trayDao = trayDao;
6     }

 

个人理解:因为spring是通过注入接口找到实现该接口的类,再为这个实现类创建一个对象,最后注入对象的。

所以意味着当一个接口有多个实现类时,想要通过type的来注入的话,Spring就会发现有两个实现类而报错。

 

怎么解决一个接口多个实现类的情况。可以通过ByName来注入。

通过为多个实现类取名字,最后指定名字来注入对象。

当不能通过ByType注入的时候,就通过@Qualifier注解ByName注入

1 @Autowired  @Qualifier("myTestDao")
2 private TestDao testDao;

 

@Resource

首先@Resource是J2EE提供的注解

@Resource一开始就完成@Autowired+ @Qualifier的功能

@Resource既可以ByType也可以ByName来注入。

 

用法

1.同时指定name和type时,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

1 @Resource(type = AndroidService.class,name = "aaa")
2 private AndroidService androidService;

 2.指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常

1 @Resource(name = "aaa")
2 private AndroidService androidService;

3.如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。

1 @Resource(type = AndroidService.class)
2 private AndroidService androidService;

4.如果既没有指定name,也没有指定type;则自动按byName方式进行查找(name是实现类的对象名)。

如果没有找到符合的bean,则回退为一个原始类型进行查找,如果找到就注入。

证明:现在不在实现类指定名字,则默认实现类对象名

@Resource(name = "androidServiceImpl")
private AndroidService androidService;

注入成功

@Resource
private AndroidService androidServiceImpl;

同样注入成功。

 

总结

@Autowired:bytype只适合一对一实现接口的时候

@Resource:byName适合一对多和一对一实现接口的时候

 

所以确定接口只会被单一实现的时候,使用@Autowired

其余情况使用 @Resource

 

转载于:https://www.cnblogs.com/Gang-Bryant/p/10887042.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值