我刚刚注意到CDI使得在Java中编写属性文件成为可能,而不是纯文本。我不确定这是否有用,但它真的很可爱。
我们在一个类中定义我们的属性。当然,由于属性将具有特定的部署,我们应该声明这个类@Alternative。 (除非它包含默认值,我想。)
@Alternative
class TestSettings {
@Produces @Named String adminUser = "admin";
@Produces @Named String adminPassword = "nimda";
@Produces @Named int maxRetries = 100;
}
现在,我们可以注入这些属性。到字段
@Inject @Named int maxRetries;
甚至到构造函数或方法
@Inject
Connection(@Named("adminUser") String user,
@Named("adminPassword") String pass) {
...
}
要选择适合部署的正确设置类,我们将其列入beans.xml:
<beans>
<alternatives>
<class>settings.TestSettings</class>
</alternatives>
</beans>
你甚至可以编写一个简单的可移植扩展,将必要的@Alternative, @Produces和@Named注解织入到以下类中
@Properties
class TestSettings {
String adminUser = "admin";
String adminPassword = "nimda";
int maxRetries = 100;
}
(如果你想了解如何做,请阅读有关ProcessAnnotatedType事件的CDI可移植扩展SPI。)
好吧,我想创建一个Settings接口,为所有属性提供getter方法,并注入该接口会更安全。尽管如此,对于这样一个“意外”的特性,这真的很酷。
更新:嗯……当你意识到TestSettings也是一个声明所有您的部署特定资源