Spring 注入 Java 可选

Spring injection with Java's 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>,并简单地 return 一个 String,那么就可以了!

我知道 Spring 有它自己的可选依赖项,但我很困惑为什么它不起作用(无论我在网上读到什么都说它应该),而且我也不明白它是如何初始化它的到 Optional.empty()?

The documentation 说:

you can express the non-required nature of a particular dependency through Java 8’s java.util.Optional, as the following example shows:

public class SimpleMovieLister {

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

所以使用 Optional 作为 bean 的类型不是一个好主意。