gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:43:20 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com