我们有一个包含多个组件(小部件)的主页,有点像包含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));
}
}
}
}
答案 0 :(得分:1)
这实际上就是我做的。我们已经使用这种方式超过3年,从来没有问题。
答案 1 :(得分:0)
您可以使用AutowireCapableBeanFactory。此类允许您将bean添加到现有的Spring上下文中。它将实例化bean并注入它们的依赖项。
我不确定我理解你所谈论的“双向”背景。您是否需要主要上下文bean来依赖“子”/其他上下文中的bean?如果是这样,即使您不喜欢该解决方案,通配符导入也可能是您最好的选择。
如果您更详细地解释整个应用程序生命周期,描述“父”/主要上下文和“子”/其他上下文的阶段,可能会有所帮助。