前言
在使用 Spring 框架时,依赖注入(DI)是一个非常重要的概念。通过注解,我们可以方便地将类的实例注入到其他类中,提升开发效率。@Autowired
又是被大家最为熟知的方式,但很多开发者在使用 IntelliJ IDEA 时,常常看到 IDEA 提示不推荐使用@Autowired
,这是为什么呢?今天讲一下我对于@Autowired
字段注入的理解。
1. 为什么不推荐使用@Autowired
?
1.1. 隐式依赖
@Autowired
会根据类型自动注入依赖,可能导致依赖不明确。特别是在存在多个符合类型的候选对象时,可能会导致注入失败或错误地注入实例。
1.2. 循环依赖
@Autowired
可能导致循环依赖,尤其在单例 Bean 中,虽然 Spring 有解决方案,但仍需额外处理。
1.3. 生命周期不透明
通过@Autowired
注入的 Bean 由 Spring 管理,类无法显式了解其生命周期。相比之下,构造器注入可以显式管理依赖的生命周期。
1.4. 不符合不可变性原则
字段注入使得依赖关系在对象生命周期内可能发生变化,而构造器注入确保依赖在对象创建时设定,符合不可变性原则。
经常看到的争议点:不推荐使用
@Autowired
,所以就使用@Resource
(使用@Resource
时,IDEA不会有波浪线提示)。
2. @Autowired
和@Resource
的基本用法
2.1. @Autowired
@Autowired
是 Spring 提供的注解,用于自动注入依赖项。Spring 会根据类型(默认情况下)或者名称(通过 @Qualifier
)来自动注入所需的 Bean。
@Autowired
private UserService userService;
在这个例子中,Spring 会自动将 UserService
类型的 Bean 注入到 userService
属性中。
2.2. @Resource
@Resource
是 Java 规范的一部分,来自 javax/jakarta.annotation
包,它更注重按照名称来注入 Bean。默认情况下,它会尝试按名称匹配,但如果没有找到匹配的名称,再通过类型注入。
@Resource
private UserService userService;
与@Autowired
不同@Resource
会首先查找名为userService
的 Bean,如果找不到,再通过类型注入。
可以看出其实两者本质上是没有区别的,只是匹配顺序不一样。