Spring Boot中Optional类型Bean晚于依赖服务创建问题求助
问题根因
- Spring 4.3及以上版本内置支持
Optional作为可选依赖的注入包装,当你在构造函数参数中声明Optional<SomeClass> some时,Spring默认会将该注入点解析为查找容器中SomeClass类型的Bean,找到就包装为Optional返回,未找到就返回空Optional,不会去匹配你声明的Optional<SomeClass>类型的Bean。 - 你的代码中仅声明了
Optional<SomeClass>类型的Bean,没有单独声明SomeClass类型的Bean,所以Spring给SomeService注入了空Optional,完成SomeService初始化后才会初始化你定义的Optional<SomeClass>类型的Bean,因此出现了你看到的输出顺序和空值问题。
修复方案
可根据业务需求选择任意一种方案:
方案1:直接声明SomeClass类型的Bean(推荐)
该用法符合Spring原生设计规范,Spring会自动将存在的Bean包装为Optional注入,不需要改动SomeService的代码:
@Bean public SomeClass someClass() { System.out.println("creating bean"); return new SomeClass("someName"); }
方案2:注入时指定@Qualifier匹配Optional类型的Bean
如果业务场景确实需要将Optional本身作为Bean注册,注入时明确指定要匹配的Bean名称即可:
@Service public class SomeService { // @Qualifier参数和你声明Bean的方法名保持一致,也可以在@Bean注解上自定义名称 public SomeService(@Qualifier("someClass") Optional<SomeClass> some) { System.out.println( some.map(SomeClass::getName).orElse("empty") ); } }
内容的提问来源于stack exchange,提问作者zp7-lx
相关产品推荐
相关产品推荐

