改变Spring 5如何处理null Beans?

Nik*_*kem 5 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);
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

它试图将类型的bean注入到类型First的服务中Second.但豆的价值是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.

有人知道在官方文件中提到这种变化吗?

Ste*_*oll 7

是的,这是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
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要无缘无故地这样做?Null 有充分的理由存在!!! (4认同)
  • Spring 跟踪器和/或更改日志条目中是否存在与 Spring 框架中的这一重大更改相关的任何问题? (3认同)