如何向Spring配置类的重写方法中注入Bean,解决字段注入警告
问题解答
现有实现是否可行
你当前的实现可以正常运行,但是不符合Spring官方推荐的依赖注入规范,因此会触发「Field injection is not recommended」的警告。
字段注入的核心弊端包括:
- 无法声明不可变依赖,字段不能用
final修饰,依赖可能被意外修改 - 单元测试时需要额外初始化Spring上下文或者用反射注入依赖,无法直接通过构造方法传入模拟对象
- 依赖关系不直观,容易出现循环依赖而无法提前感知
优化方案
方案1:构造方法注入(推荐)
Spring 4.3及以上版本中,若类中只有一个构造方法,不需要显式添加@Autowired注解,Spring会自动识别注入点。且当没有类型为Something的Bean存在时,Spring会默认注入空集合,不需要额外设置required = false,也不会出现空指针问题。
优化后代码如下:
@Configuration class ConfigurationImpl extends AbstractConfiguration { // 声明为final保证依赖不可变 private final Collection<Something> collection; public ConfigurationImpl(Collection<Something> collection) { this.collection = collection; } @Override protected void configureSettings(Builder builder) { builder.addCollection(collection); } }
如果项目中使用Lombok,可以直接添加@RequiredArgsConstructor注解省略手写构造方法的步骤:
@Configuration @RequiredArgsConstructor class ConfigurationImpl extends AbstractConfiguration { private final Collection<Something> collection; @Override protected void configureSettings(Builder builder) { builder.addCollection(collection); } }
方案2:Setter注入
如果你的依赖确实是可选的,也可以选择Setter注入,这是Spring官方推荐的可选依赖注入方式,显式标识依赖的可选性:
@Configuration class ConfigurationImpl extends AbstractConfiguration { private Collection<Something> collection; @Autowired(required = false) public void setCollection(Collection<Something> collection) { this.collection = collection; } @Override protected void configureSettings(Builder builder) { // 空判断避免传入null builder.addCollection(collection == null ? Collections.emptyList() : collection); } }
额外提示
你给出的抽象配置类名AbstactConfiguration存在拼写笔误,缺少字母r,建议修正为AbstractConfiguration更符合命名规范。
内容的提问来源于stack exchange,提问作者alxspb
相关产品推荐
相关产品推荐

