我们有一个包含多个组件(小部件)的主页,有点像包含 portlet 的门户。其中一些小部件将从其他团队的广告 jar 中交付,其中一些将需要一些自定义 bean 由 Spring 管理。一种解决方案可能是使用带有 I 通配符的导入语句导入 spring 上下文(例如,导入类路径中匹配 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 年多了,从来没有出现过问题。
关于java - Spring 在运行时添加外部 spring 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111851/