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

时间:2012-02-02 11:52:58

标签: java spring

我们有一个包含多个组件(小部件)的主页,有点像包含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));
            }
        }

    }
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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

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

相关问题