动态注入弹簧豆
在java-spring Web应用程序中,我希望能够动态注入bean。例如,我有一个包含2种不同实现的接口:
在我的应用程序中,我正在使用一些属性文件来配置注入:
#Determines the interface type the app uses. Possible values: implA, implB
myinterface.type=implA
我的注入实际上有条件地加载了属性文件中的属性值。例如,在这种情况下,myinterface.type=implA,无论我在哪里注入MyInterface,将要注入的实现都将是ImplA(我通过扩展条件注释实现了这一点)。
我希望在运行时 - 一旦属性更改,将发生以下情况(无需重新启动服务器):
- 将注入正确的实施。例如,当设置 ImplB 将被注入到使用 MyInterface 的地方时
myinterface.type=implB
- 春季环境应使用新值进行刷新,并重新注入豆类。
我想过刷新我的上下文,但这会产生问题。我想也许可以使用 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;
}
}
}
一旦属性更改,我应该重新注入我的环境。对此有什么建议吗?
我知道我可以在方法而不是构造函数中查询该env,但这是性能降低,我也想考虑一个用于重新注入环境的ider(再次,也许使用setter注入?)。