我有一个有趣的用例,我正在考虑编写一个通用FactoryBean
来从两个上下文之一中选择一个实例。
详细说明:
root
,有两个孩子:legacy
和newShiny
。现在我的FactoryBean
看起来像是:
class MyServiceFactoryBean extends AbstractFactoryBean<MyService> {
@Inject
@Qualifier("legacy")
ApplicationContext legacy;
@Inject
@Qualifier("newShiny")
ApplicationContext newShiny;
@Override
protected MyService createInstance() throws Exception {
if (tossCoin() == HEADS) {
return legacy.getBean(MyService.class);
} else {
return newShiny.getBean(MyService.class);
}
}
@Override
public java.lang.Class<?> getObjectType() {
return MyService.class;
}
}
这似乎是解决我的问题的方法,但让父母意识到自己的孩子会感到肮脏和非法(我们生活在哪个世界?)。
那么,这是个坏主意吗?为什么?它会导致什么问题?有哪些替代方案?或者这可能是一件几乎正常的事情?
对于一些背景知识,我需要支持两个非常不同的模型,我想隐藏在接口后面并在运行时选择实现(是的,它必须在运行时是动态的)。我正在考虑为他们使用不同的环境来保持清洁,避免干扰。