Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring-从父上下文引用子上下文_Java_Spring - Fatal编程技术网

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配置文件的问题是,据我所知,它们太静态。我希望同时激活这两个应用程序(我的应用程序对不同的用户同时使用两个实现),我只希望对特定的用户激活一个应用程序。但是,具有多个上下文的解决方案感觉过于臃肿,感觉就像使用佳能来拍摄房间里烦人的嗡嗡虫。我可能会在不同的配置文件中分离它们,在单个上下文中加载它们,并使用代理/工厂来确定使用哪一个。您可以实现一次逻辑并重用(基本上是您现在已经在单个上下文中执行的操作)。