一、导读
@Autowired和@Resource都是Spring框架里用于依赖注入的注解;
二、所属框架与依赖
- @Autowired:它是 Spring 框架自带的注解,要使用该注解,项目必须引入 Spring 的相关依赖。
- @Resource:此注解来自 JSR-250 规范,属于 Java EE 的一部分。在 Java 6 及之后的版本中,该注解被集成到了 JDK 里,所以使用它无需额外添加依赖。
三、注入依据
- @Autowired:默认按照类型(byType)来进行依赖注入。要是存在多个相同类型的 bean,就需要结合
@Qualifier
注解或者将变量名与 bean 名称对应起来使用。 - @Resource:默认依据名称(byName)来注入依赖。它有
name
和type
两个属性,若指定了name
属性,就会按照名称查找;若指定了type
属性,则会按照类型查找。如果这两个属性都未指定,就会先根据变量名查找,若找不到再依据类型查找。
四、属性设置
- @Autowired:拥有
required
属性,该属性为布尔值,默认是true
,意味着依赖必须存在,否则会抛出异常。若设为false
,当依赖不存在时会注入null
。 - @Resource:具备
name
和type
属性,可分别用于指定 bean 的名称和类型。
五、使用示例
@Autowired示例
@Component
public class UserService {
@Autowired
private UserRepository userRepository; // 按类型注入
// 当存在多个相同类型的bean时,需结合@Qualifier使用
@Autowired
@Qualifier("primaryUserRepository")
private UserRepository primaryUserRepository;
}
@Resource示例
@Component
public class UserService {
@Resource
private UserRepository userRepository; // 先按名称查找,再按类型查找
@Resource(name = "userRepositoryImpl")
private UserRepository customUserRepository; // 按名称查找
}
六、注入对象范围
- @Autowired:既可以对构造函数、方法、字段进行注入,还能对参数进行注入。
- @Resource:主要用于对方法和字段进行注入。
七、总结
在 Spring 项目里,推荐优先使用@Autowired
,因为它是 Spring 原生的注解,并且支持更多的特性。而在需要与 Java EE 规范兼容的场景中,@Resource
是更好的选择。