簡體   English   中英

改變Spring 5如何處理null Beans?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM