使用Java的Optional进行春季注入

时间:2019-10-23 18:24:07

标签: java spring optional

当尝试注入Optional<T>时,Spring不会调用我的bean,而是注入Optional.empty()

以下是一些示例代码:

@Configuration
public class Initialize {

    @Value("optionalValue")
    private String testString;

    @Bean (name = "getOptionalString")
    public Optional<String> getOptionalString() {
        return Optional.of(this.testString); //breakpoint put here, is never called
    }
}

@Component
public class Test {

    public Test(@Qualifier("getOptionalString") Optional<String> optional) {
      // optional's value is Optional.empty() here
    }

我注意到(通过设置断点)@Bean从未被调用。如果我要删除Optional<String>,而只是返回一个String,那么它将起作用!

我知道Spring有其自己的可选依赖项,但是我对为什么它不起作用感到困惑(无论我在网上阅读什么都说应该如此),而且我也不了解它如何将其初始化为{ {1}}?

1 个答案:

答案 0 :(得分:2)

The documentation说:

  

您可以通过Java 8的java.util.Optional来表达特定依赖项的非必需性质,如以下示例所示:

public class SimpleMovieLister {

    @Autowired
    public void setMovieFinder(Optional<MovieFinder> movieFinder) {
        ...
    }
}

因此,使用Optional作为bean的类型不是一个好主意。