改变Spring 5如何处理null Beans?

时间:2018-03-01 07:37:38

标签: java spring spring-boot

所以,我有以下申请:

@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 $首先'那不可能   找到。

是否有人知道在官方文件中提及此类变更?

2 个答案:

答案 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));
  }
}