Spring注入与Java的Optional

Tib*_*riu 9 java spring option-type

当尝试注入一个 时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
    }
Run Code Online (Sandbox Code Playgroud)

我注意到(通过设置断点)@Bean永远不会被调用。如果我删除Optional<String>,并简单地返回String,那么它就可以了!

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

JB *_*zet 11

文档说:

\n\n
\n

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

\n\n
public class SimpleMovieLister {\n\n    @Autowired\n    public void setMovieFinder(Optional<MovieFinder> movieFinder) {\n        ...\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

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

\n

  • @Dedyshka您不需要在Bean方法中声明Optional,您只需要在自动装配的地方使用Optional。 (2认同)