因此,我有以下应用程序:
@SpringBootApplication public class AutonullApplication { public static void main(String[] args) { SpringApplication.run(AutonullApplication.class, args); } @Bean First first() { return null; } public class First { } @Service public class Second { private final First first; public Second(First first) { this.first = first; } @PostConstruct public void print() { System.out.println("First = " + first); } } }
试图将类型的bean注入类型First的服务中Second。但是Bean的价值为null。这段代码在Spring Boot 1.5.10(以及Spring 4)中运行良好,但在Spring Boot 2.0(以及Spring 5)中失败:
First
Second
null
描述: eu.plumbr.autonull.AutonullApplication $ Second中的构造函数的参数1需要找不到类型为eu.plumbr.autonull.AutonullApplication $ First的bean。
描述:
eu.plumbr.autonull.AutonullApplication $ Second中的构造函数的参数1需要找不到类型为eu.plumbr.autonull.AutonullApplication $ First的bean。
有人知道官方文档中有这种更改吗?
是的,这是Spring Framework 5中的重大更改。可以说,这样的设置很奇怪,我们希望稍微加强一下这些规则。
如果您请求注入First并提供null,那么考虑未提供Bean更加一致。然后,您可以查询上下文中是否存在First。@spencergibb已经解释了如何使用Optional,或者可以ObjectProvider<First>用作注入点:
Optional
ObjectProvider<First>
@Service public class Second { private final First first; public Second(ObjectProvider<First> first) { this.first = first.getIfAvailable(); // return null } }