加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:31:17 所属栏目:Java 来源:网络整理
导读:我们有一个包含多个组件(小部件)的主页,有点像包含portlet的门户.其中一些小部件将由其他团队提供广告罐,其中一些将需要一些由 Spring管理的自定义bean.一种解决方案可能是使用带有I通配符的import语句导入spring上下文(例如,在classpath匹配context-widget
我们有一个包含多个组件(小部件)的主页,有点像包含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年,从来没有问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读