Spring——》@Autowired和@Resource
一、共同点
1、做bean的注入时使用
2、写在字段上,或写在setter方法
二、不同点
注解 | 提供 | 包 | 注入方式 |
---|---|---|---|
@Autowired | Spring | org.springframework.beans.factory.annotation.Autowired | 默认按照byType注入 |
@Resource | JDK1.6 | javax.annotation.Resource | 默认按照byName注入 |
三、@Autowired
1、按照类型byType注入:默认
注意:默认情况要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false
import org.springframework.beans.factory.annotation.Autowired;
public class TestAutowired {
// 方式1:用于字段上
@Autowired
private UserDao userDao;
// 方式2:用于字段的setter方法上
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
2、按照名称byName注入
结合 @Qualifier 注解一起使用
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class TestAutowired {
// 方式1:用于字段上
@Autowired
@Qualifier("userDao")
private UserDao userDao;
// 方式2:用于字段的setter方法上
@Autowired
@Qualifier("userDao")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
四、@Resource
name:bean的名字,使用byName注入
type:bean的类型,使用byType注入
注意 :如果name和type都没有指定,将通过 反射机制 使用 byName注入策略
1、按照类型byType注入
import javax.annotation.Resource;
public class TestAutowired {
// 方式1:用于字段上
@Resource(type = UserDao.class)
private UserDao userDao;
// 方式2:用于字段的setter方法上
@Resource(type = UserDao.class)
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
2、按照类型byName:默认
import javax.annotation.Resource;
public class TestAutowired {
// 方式1:用于字段上
// @Resource() 默认按照byName注入
@Resource(name = "userDao")
private UserDao userDao;
// 方式2:用于字段的setter方法上
@Resource(name = "userDao")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
3、装配顺序
1)同时指定name和type
从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
2)指定name
从Spring上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
3)指定type
从Spring上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
4)同时没有指定name和type
自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。