繁体   English   中英

Spring在运行时添加外部spring上下文

[英]Spring add external spring context at runtime

我们有一个包含多个组件(小部件)的主页,有点像包含portlet的门户。 其中一些小部件将由其他团队提供广告罐,其中一些将需要一些由Spring管理的自定义bean。 一种解决方案可能是使用带有I通配符的import语句导入spring上下文(例如,在classpath匹配context-widget - * .xml中导入所有上下文)。

但是,我更喜欢一种更具编程性的解决方案,我在其中检查每个小部件需要加载的上下文(来自类路径)。 我没有找到任何解释这个问题的博客,但确实在论坛上发现了一些帖子,说明这将是一个父子语境,这只是单向的; 不幸的是,在我的情况下,它需要是双向的。

因此,在浏览了一些API之后,我设法提出了一些有效的方法,但我不相信它是一个很好的解决方案,或者它有任何我没有想到的陷阱。 对于这种情况,或许还有另一种(更好的)解决方案?

public class WidgetManager implements ApplicationContextAware
{

    @Autowired
    private WidgetService widgetService;

    @Override
    public void setApplicationContext(ApplicationContext parentApplicationContext) throws BeansException {
        //I do need the parent context to have finished initializing beans
        List<WidgetTO> widgets = widgetService.findAllWidgets();

        List<String> contexts = newArrayListWithCapacity(widgets.size());
        for (WidgetTO widget : widgets) {
            if (isNotBlank(widget.getSpringContext())) {
                contexts.add(widget.getSpringContext());
            }
        }

        AbstractRefreshableWebApplicationContext parentContext = (AbstractRefreshableWebApplicationContext) parentApplicationContext;

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(contexts.toArray(new String[] {}), parentApplicationContext);
        String[] singletonNames = context.getBeanFactory().getSingletonNames();
        for (String s : singletonNames) {
            //copy all singletons that don't already exist from child to parent
            if (!parentContext.getBeanFactory().containsSingleton(s)) {
                parentContext.getBeanFactory().registerSingleton(s, context.getBeanFactory().getSingleton(s));
            }
        }

    }
}

这实际上就是我做的。 我们已经使用这种方式超过3年,从来没有问题。

您可以使用AutowireCapableBeanFactory。 此类允许您将bean添加到现有的Spring上下文中。 它将实例化bean并注入它们的依赖项。

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html

我不确定我理解你所谈论的“双向”背景。 您是否需要主要上下文bean来依赖“子”/其他上下文中的bean? 如果是这样,即使您不喜欢该解决方案,通配符导入也可能是您最好的选择。

如果您更详细地解释整个应用程序生命周期,描述“父”/主要上下文和“子”/其他上下文的阶段,可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM