Java Spring-从父上下文引用子上下文
我有一个有趣的用例,我正在考虑编写一个通用的Java Spring-从父上下文引用子上下文,java,spring,Java,Spring,我有一个有趣的用例,我正在考虑编写一个通用的FactoryBean,从两个上下文中选择一个实例 详情: 我的父上下文名为root,有两个子上下文:legacy和newShiny 这两个子上下文在根上下文上注册为常规bean 现在我的FactoryBean看起来像: class MyServiceFactoryBean extends AbstractFactoryBean<MyService> { @Inject @Qualifier("legacy")
FactoryBean
,从两个上下文中选择一个实例
详情:
- 我的父上下文名为
,有两个子上下文:root
和legacy
newShiny
- 这两个子上下文在根上下文上注册为常规bean
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;
}
}
类MyServiceFactoryBean扩展了AbstractFactoryBean{
@注入
@限定词(“遗留”)
应用环境遗产;
@注入
@限定词(“newShiny”)
应用上下文新闻;
@凌驾
受保护的MyService createInstance()引发异常{
if(tossCoin()==头){
返回legacy.getBean(MyService.class);
}否则{
返回newShiny.getBean(MyService.class);
}
}
@凌驾
public java.lang.Class getObjectType(){
返回MyService.class;
}
}
这看起来确实是解决我问题的办法,但让父母意识到自己的孩子是肮脏和非法的(我们生活在什么世界?)
那么,这是个坏主意吗?为什么?它会导致什么问题?有哪些替代方案?或者这几乎是正常的事情
对于一些背景知识,我需要支持两个非常不同的模型,我想隐藏在接口后面,并在运行时选择实现(是的,它在运行时必须是动态的)。我正在考虑为他们使用不同的上下文,以保持事情的整洁并避免干扰。您是如何在根上下文上注册/定义这样的子上下文的?这个解决方案似乎很复杂,为什么不简单地创建一个
FactoryBean
,它根据属性返回正确的实例,而不是将其放在其他上下文中。另外,不要使用FactoryBean
而是使用概要文件。定义一个包含旧bean的legacy
概要文件,为新实现定义一个newShine
。我不会开始处理多个上下文,因为这会使事情变得更复杂,你可能会遇到其他问题。@M.Deinum单独的上下文会使事情更干净、更明显地独立,并且不会产生干扰。@M.Deinum配置文件的问题是,据我所知,它们太静态。我希望同时激活这两个应用程序(我的应用程序对不同的用户同时使用两个实现),我只希望对特定的用户激活一个应用程序。但是,具有多个上下文的解决方案感觉过于臃肿,感觉就像使用佳能来拍摄房间里烦人的嗡嗡虫。我可能会在不同的配置文件中分离它们,在单个上下文中加载它们,并使用代理/工厂来确定使用哪一个。您可以实现一次逻辑并重用(基本上是您现在已经在单个上下文中执行的操作)。