如何禁用Spring中指定类的特定字段自动注入功能
报错根本原因
@Configuration标注的类本身会被Spring作为Bean实例化,Spring 4.3及以上版本中,类只有一个构造方法时,会默认触发构造方法自动注入,Spring尝试从容器中找Enumerator、RandomDataGenerator、AliasMethodFactory对应的Bean注入构造方法,找不到就抛出异常。你代码中静态@Bean方法返回的CustomRandom是业务Bean,和Spring实例化的配置类实例是两个不同的对象,不会互相影响。
可选解决方案
方案1:新增无参构造方法(最快修复)
给CustomRandom类新增空的无参构造方法,供Spring实例化配置类时使用,原有逻辑完全不需要改动:
@Configuration public class CustomRandom { private Enumerator enumerator; private RandomDataGenerator rDataGenerator; private AliasMethodFactory amf; // 新增无参构造 public CustomRandom(){} @Bean @Primary public static CustomRandom buildRandom() { return new CustomRandom( new Enumerator(), new RandomDataGenerator( new MersenneTwister(System.currentTimeMillis() * Thread.currentThread().getId()) ), new AliasMethodFactory() ); } CustomRandom(Enumerator enumerator, RandomDataGenerator generator, AliasMethodFactory amf) { this.enumerator = enumerator; this.rDataGenerator = generator; this.amf = amf; } // 其余方法省略 }
方案2:关闭构造方法的自动注入
如果不想新增无参构造,可以给现有有参构造方法标注@Autowired(required = false),告知Spring找不到对应Bean时不需要注入,直接跳过:
// 给构造方法加注解 @Autowired(required = false) CustomRandom(Enumerator enumerator, RandomDataGenerator generator, AliasMethodFactory amf) { this.enumerator = enumerator; this.rDataGenerator = generator; this.amf = amf; }
该方案属于临时适配,不推荐长期使用。
方案3:拆分配置类和业务类(最规范)
当前写法把配置类和业务Bean类耦合在一起不符合Spring规范,拆分后可以彻底避免这类问题:
- 把
CustomRandom的@Configuration注解去掉,作为普通业务类:
public class CustomRandom { private Enumerator enumerator; private RandomDataGenerator rDataGenerator; private AliasMethodFactory amf; public CustomRandom(Enumerator enumerator, RandomDataGenerator generator, AliasMethodFactory amf) { this.enumerator = enumerator; this.rDataGenerator = generator; this.amf = amf; } // 其余方法省略 }
- 新增单独的配置类注册Bean:
@Configuration public class CustomRandomConfig { @Bean @Primary public CustomRandom buildRandom() { return new CustomRandom( new Enumerator(), new RandomDataGenerator( new MersenneTwister(System.currentTimeMillis() * Thread.currentThread().getId()) ), new AliasMethodFactory() ); } }
这种写法后续扩展维护成本更低,适合长期迭代的项目。
内容的提问来源于stack exchange,提问作者ac_
相关产品推荐
相关产品推荐

