@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