在我的应用程序中,我使用一些属性文件来配置注入:
#Determines the interface type the app uses. Possible values: implA, implB
myinterface.type=implA
我的注入实际上是有条件地加载的,取决于属性文件中的属性值。例如,在这种情况下,当myinterface.type=implA时,无论在哪里注入MyInterface,都将注入ImplA(我通过扩展条件注解来实现了这一点)。
我希望在运行时 - 一旦更改了属性,以下内容将发生(无需重新启动服务器):
- 正确的实现将被注入。例如,当设置
myinterface.type=implB
时,无论在哪里使用MyInterface,都将注入ImplB - Spring环境也应以新值刷新并重新注入到bean中。
我考虑过刷新我的上下文,但那会引起问题。我想也许可以使用setter进行注入,并在重新配置属性后重复使用这些setter。是否有适用于此要求的工作实践呢?
有任何想法吗?
更新
有人建议我可以使用一个工厂/注册表来保存两个实现(ImplA和ImplB),并通过查询相关属性返回正确的实现。 如果我这样做,我仍然面临第二个挑战 - 环境。例如,如果我的注册表如下所示:
@Service
public class MyRegistry {
private String configurationValue;
private final MyInterface implA;
private final MyInterface implB;
@Inject
public MyRegistry(Environmant env, MyInterface implA, MyInterface ImplB) {
this.implA = implA;
this.implB = implB;
this.configurationValue = env.getProperty("myinterface.type");
}
public MyInterface getMyInterface() {
switch(configurationValue) {
case "implA":
return implA;
case "implB":
return implB;
}
}
}
一旦属性更改,我应该重新注入我的环境。有什么建议吗?
我知道我可以在方法内查询该环境,而不是构造函数,但这会降低性能,而且我想考虑重新注入环境的想法(也许使用setter注入?)。