我是Spring框架的常规用户,我想我对框架非常了解,但是似乎我总是在寻找我不知道的有用东西。 在Devoxx,我了解到您可以使用Java 8的新Optional<T>
类型来表达条件依赖。 请注意,在Java 8之前,可以使用@Autowired(required = false)
自动连接可选的依赖项,但随后必须检查null。
那有多好? 好吧,我可以考虑一百万个用例,但是以下这些是我想到的:
- 取决于上下文,防止使用基础结构依赖项。 例如,在开发环境中,无需将指标发送到
MetricRegistry
- 未提供所需的基础结构依赖项时提供默认值, 例如 h2数据源
- 在测试环境中也可以这样做。
- 等等
实现非常简单:
@ContextConfiguration(classes=OptionalConfiguration.class)
publicclassDependencyPresentTestextendsAbstractTestNGSpringContextTests{
@Autowired
privateOptional<HelloService>myServiceOptional;
@Test
publicvoidshould_return_hello(){
StringsayHello=null;
if(myServiceOptional.isPresent()){
sayHello=myServiceOptional.get().sayHello();
}
assertNotNull(sayHello);
assertEquals(sayHello,"Hello!");
}
}
在这一点上,不仅代码可以很好地编译,而且在编译时会评估依赖项。 OptionalConfiguration
包含HelloService
上面的测试成功或失败,并且测试失败。
这种模式非常优雅,我建议您将其列出在可用工具包中。
翻译自: https://blog.frankel.ch/optional-dependencies-in-spring/