考虑这个例子
@Stateless
public class UniqueIdGenerator {
private static final String COLON = ":";
private String serverPrivateKey;
@SuppressWarnings("UnusedDeclaration")
public UniqueIdGenerator() {
}
@Inject
public UniqueIdGenerator(@Nonnull final String serverPrivateKey) {
this.serverPrivateKey = serverPrivateKey;
}
...
}
我希望@Inject
基于不同环境中可用的环境变量serverPrivateKey
的值。
在这里注射它的最佳方法是什么?
答案 0 :(得分:3)
要从环境中注入值,而不是编写自己的生成器方法,您可能需要查看Apache DeltaSpike的Configuration API。
使用@ConfigProperty
限定符,可以从许多不同的属性源中注入值,例如系统属性,环境变量或JNDI。
示例:
@Inject
@ConfigProperty(name = "SERVER_PRIVATE_KEY")
private String serverPrivateKey;
答案 1 :(得分:1)
我们使用以下模式:有一个bean可以为我们提供所需的价值。 bean知道如何获取值(环境,系统属性,等等)。为了使以后更容易,bean的类型应该是一个接口(在你的情况下可能是IPrivateKeyProvider
)。
然后创建UniqueIdGenerator
并注入第一个bean。然后,设置决定这将是哪个bean(某种模拟测试和生产代码的实际实现)。
答案 2 :(得分:0)
您必须使用生产者方法:
根据related oracle documentation:
生成器方法生成一个可以注入的对象。通常,您使用生产者 以下情况中的方法:
- [...]
- 当要注入的对象的具体类型可能在运行时发生变化时
查看示例here