小编典典

更改Spring 5处理空Bean的方式?

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

}

试图将类型的bean注入类型First的服务中Second。但是Bean的价值为null。这段代码在Spring Boot
1.5.10(以及Spring 4)中运行良好,但在Spring Boot 2.0(以及Spring 5)中失败:

描述:

eu.plumbr.autonull.AutonullApplication $
Second中的构造函数的参数1需要找不到类型为eu.plumbr.autonull.AutonullApplication $ First的bean。

有人知道官方文档中有这种更改吗?


阅读 366

收藏
2020-05-30

共1个答案

小编典典

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

}
2020-05-30