注解@Autowired和@Resource区别及使用方法
@Resource作用相当于@Autowired,都是用作bean注入的。
spring不但支持自家的注解,也支持几个由JSR-250规范定义的注解,分别是@Resource、@PostConstruct以及@PreDestroy
相同点
两者都可以写在字段或set方法上;如果写在字段上,则不需要再写set方法。
区别
- @Autowired是spring的注解,@Resource是j2ee的注解。
- @Autowired默认按照byType自动注入;@Resource默认按照byName自动注入
@Resource属性说明
@Resource有两个属性比较重要,name和type,spring将name属性解析为bean的名字,将type属性解析为bean的类型。它默认按照name去寻找bean进行注入,如果没有找到则按type去寻找。都找不到的话抛异常。
装配顺序:
- 如果同时指定了name和type,则从spring上下文中找到唯一匹配的bean进行装配,找不到抛异常
- 如果指定了name,则从spring上下文中查找名称(id)匹配的bean进行装配,找不到抛异常
- 如果指定了type,则从spring上下文中查找类型匹配的bean进行装配,找不到或找到多个都会抛异常
- 如果既没有指定name又没有指定type,默认按照byName的策略进行装配。如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配
@Autowire属性说明
1、@Autowire有一个重要属性,required,表示需要注入的这个bean对象是否必需,如果必需但是按byName没有找到这个bean就会抛异常。required属性缺省值为true必需,false不必需
2、如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:
public class TestServiceImpl {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
@Autowired的两种使用方法
spring会找到上下文中类型为UserDao的bean自动注入
// 通过字段注入
@Autowired
// @Autowired(required = false) // 允许字段为null。required属性的缺省值为true
private UserDao userDao;
// 通过setter方法注入
private UserDao userDao;
@Autowired
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}