所以,我有以下申请:
@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)中失败:
说明
构造函数的参数1 eu.plumbr.autonull.AutonullApplication $ Second需要一个类型的bean ' eu.plumbr.autonull.AutonullApplication $首先'那不可能 找到。
是否有人知道在官方文件中提及此类变更?
答案 0 :(得分:5)
是的,这是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(); // return null
}
}
答案 1 :(得分:2)
java 8,null-safe方式是使用Optional
类。
@Service
public class Second {
private final Optional<First> first;
public Second(Optional<First> first) {
this.first = first;
}
@PostConstruct
public void print() {
System.out.println("First = " + first.orElse(null));
}
}