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年,从来没有问题.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |