[英]Change in how Spring 5 handles null Beans?
所以,我有以下應用程序:
@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中構造函數的參數1 $ 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(); // return null
}
}
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));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.