@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