Spring容器自动配置中同时Autowired构造器与字段是否错误?
同时在字段和构造器上使用@Autowired会发生什么?
这个场景我之前也碰到过,其实不会直接触发报错,但会有重复注入的操作,甚至可能出现和你预期不符的结果,我给你一步步拆解:
首先看你给出的代码:
@Component public class Test1 { @Autowired private Test2 B; @Autowired public Test1(Test2 C) { this.B = C; } }
具体执行流程
- 构造器注入优先执行:Spring创建
Test1Bean时,会先识别到带有@Autowired注解的构造器,于是先把Test2的实例注入到构造器参数C里,然后通过this.B = C把字段B赋值为这个Test2实例。 - 字段注入随后执行:构造器执行完、实例化完成后,Spring会继续处理类中带有
@Autowired注解的字段,这时候它会再次把Test2的实例注入到字段B中。
不同作用域下的差异
- 如果
Test2是单例(默认作用域):两次注入的是同一个Test2实例,表面上看好像没什么问题,但其实做了一次多余的赋值操作,完全没必要。 - 如果
Test2是原型(prototype):构造器注入时会创建一个Test2实例,字段注入时又会创建一个新的Test2实例,最后字段B会被覆盖成第二次注入的实例,这就和你构造器里的赋值逻辑冲突了,很容易引发隐藏bug。
最佳实践
- 尽量只选择一种注入方式,官方推荐使用构造器注入:它更利于单元测试(可以手动传入依赖),而且从Spring 4.3开始,如果类只有一个构造器,甚至可以省略
@Autowired注解。 - 避免混合使用字段注入和构造器注入,既减少不必要的操作,也能避免潜在的逻辑冲突。
内容的提问来源于stack exchange,提问作者Meninx - メネンックス
相关产品推荐
相关产品推荐

