@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);
}
}
}
尝试将一个类型为First
的bean注入到一个类型为Second
的服务中。但是该bean的值是null
。这段代码在Spring Boot 1.5.10(以及Spring 4)中运行正常,但在Spring Boot 2.0(以及Spring 5)中失败:
有没有人知道官方文档中有关此更改的任何提及?描述:
eu.plumbr.autonull.AutonullApplication$Second的构造函数的第一个参数需要一个类型为'eu.plumbr.autonull.AutonullApplication$First'的bean,但找不到。
是的,这是Spring Framework 5中的一个重大变化。可以说,这样的设置很奇怪,我们想要稍微加强这些规则。
如果你请求注入
First
,并且提供了null
,那么更一致的做法是认为没有提供该bean。然后你可以查询上下文是否存在First
。@spencergibb已经解释了你可以如何使用Optional
,或者你可以使用ObjectProvider<First>
作为注入点:@Service public class Second { private final First first; public Second(ObjectProvider<First> first) { this.first = first.getIfAvailable(); // 返回null } }