今天,部门新来的实习生不了解@Resource注解和@Autowired注解的区别,所以跟他讲了下,也顺便记录下。
一、这俩注解是干什么的?
@Resource注解和@Autowired注解都是用来实现依赖注入的。
二、这俩注解的相同点
@Resource注解和@Autowired注解都可以作用在成员变量和方法上。
三、这俩注解的不同点
1、@Resource
1.1 @Resource是JDK提供的注解,Spring支持通过该注解实现依赖注入。
1.2 @Resource有两个重要的属性:name和type,Spring把@Resource注解的name属性解析为bean的名字,通过byName的方式自动注入;Spring把type属性解析为bean的类型,通过byType的方式自动注入;默认情况下是按照byName的方式自动注入。
1.3 Spring针对@Resource解析过程:
如果设置了name,则从上下文中查找名称匹配的bean进行注入,找不到会抛出异常。
如果设置了type,则从上下文中查找类型匹配的唯一bean进行注入,找不到或者找到多个,都会抛出异常。
如果同时设置了name和type,则从上下文中找到唯一匹配的bean进行注入,找不到会抛出异常。
如果既没有设置name,又没有设置type,则自动按照byName方式进行注入;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动注入。
1.4 代码示例
作用在成员变量上:
public class XxxServiceImpl {
@Resource(name="xxxDao")
private XxxDao xxxDao;
}
复制
作用在方法上:
public class XxxServiceImpl {
@Resource(name="xxxDao")
public void setXxxDao(XxxDao xxxDao) {
this.xxxDao = xxxDao;
}
}
复制
2、@Autowired
2.1 @Autowired是Spring提供的注解,只能通过byType的方式自动注入。默认情况下它要求依赖对象必须存在,否则,可以设置它的required属性为false。
作用在成员变量上:
public class XxxServiceImpl {
@Autowired
private XxxDao xxxDao;
}
复制
作用在方法上:
public class XxxServiceImpl {
@Autowired
public void setXxxDao(XxxDao xxxDao) {
this.xxxDao = xxxDao;
}
}
复制
2.2 如果想使用@Autowired按照byName的方式自动注入,需要结合@Qualifier注解(限定哪个bean应该被注入)一起使用,代码示例如下:
public class XxxServiceImpl {
@Autowired
@Qualifier("xxxDao")
private XxxDao xxxDao;
}
复制