配置@Autowired(required=false)的C类仍被Spring查找实例报错如何解决
问题原因
你遇到的报错核心是Spring无法识别构造函数参数上标注的@Autowired(required = false)配置:
- Spring 4.3之前的版本完全不支持在构造函数参数上添加
@Autowired注解,所有参数默认按必填处理 - 即使是4.3及以上版本,参数级别的
@Autowired的required属性也存在兼容性问题,多数场景下不会生效,Spring会默认认为所有构造函数参数都是必填项,找不到对应Bean就直接抛出NoSuchBeanDefinitionException
正确解决方案
方案1:构造函数整体加@Autowired配合空值标识(推荐,兼容性最好)
将@Autowired注解移到构造函数上,非必填参数用Spring自带的@Nullable注解标注,或者用Java 8+的Optional包装参数:
@Component @Slf4j public class Foo { private A aa; private B bb; private C cc; @Autowired public Foo(final A aa, final B bb, @org.springframework.lang.Nullable final C cc) { this.aa = aa; this.bb = bb; this.cc = cc; } }
如果用Optional写法,不需要额外加注解:
public Foo(final A aa, final B bb, final Optional<C> cc) { this.aa = aa; this.bb = bb; this.cc = cc.orElse(null); }
方案2:改用字段注入
如果不想调整构造函数写法,也可以把非必填的C类改成字段注入,单独标注@Autowired(required = false):
@Component @Slf4j public class Foo { private A aa; private B bb; @Autowired(required = false) private C cc; @Autowired public Foo(final A aa, final B bb) { this.aa = aa; this.bb = bb; } }
内容的提问来源于stack exchange,提问作者mayank lalaiya
相关产品推荐
相关产品推荐

