前言:
经常使用idea开发经常遇到@Resource注解和@Autowired注解,
本文来浅总结一下两者的异同
@Autowired
-
@Autowired 是Spring中注入Bean所使用的注解,使用时需要导入包
org.springframework.beans.factory.annotation.Autowired;
-
默认按照byType注入(优先根据接口类型去匹配注入 Bean (即接口的实现类))
tips: 默认情况下要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。
如想使用byName方式进行Bean注入,需要配合 @Qualifier注解使用:
eg:
@Autowired
@Qualifier("userMapper")
private UserMapper userMapper;
@Resource
-
@Resource是JDK中的注解,使用时需要导入包
javax.annotation.Resource
-
默认按照byName自动注入,存在两个属性:name和type
tips 如果无法通过名称(byName)匹配到对应的实现类的话,注入方式会变为byType
eg:
@Resource(name = "userMapper", type = UserMapper.class)
private UserMapper userMapper;
// 用在setter方法上
@Resource(name="useDao")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
注: 最好是将@Resource放在setter方法上,更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。
补充:
- 如果同时指定name和type,则从上下文中找到唯一匹配的bean进行装配注入,找不到则抛异常;
- 如果指定name,则从上下文中查找名称匹配的bean进行装配注入,找不到则抛异常
- 如果指定type,则从上下文中找到类型匹配的唯一bean进行装配注入,找不到或者找到多个,都会抛异常;
- 如果既没有指定name,又没有指定type,则默认按照byName方式进行装配注入;如果不匹配,则回退为根据类型匹配,如果匹配则自动装配注入,否则抛异常
总结:
同:
- 都可作为上下文注入Bean所用注解
异:
-
-
@Autowired 是Spring的注解,使用时需要导入
org.springframework.beans.factory.annotation.Autowired;
-
@Resource是jdk内置的java注解,使用时需要导入
javax.annotation.Resource
-
-
-
@Autowired默认按照上下文类型匹配注入,如果没找到则抛异常
-
@Resource默认查找名称匹配注入,如果没找到则回退为根据上下文类型匹配,如果都没找到,则抛异常
-
-
-
@Autowired如果要根据名称匹配,需要配合 @Qualifier 注解使用
-
@Resource默认包含两个属性:name和type,分别指定名称和类型
-