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

标签 java spring

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

相关文章:

java - 跟踪大型应用程序源代码中的线程初始化

java - Hudson 无法使用 unix 用户/组进行身份验证

Java-Spring : NullPointerException during context initialization (Using @Component, @Autowired,,上下文:组件扫描)

java - 应该如何从 Spring Data Neo4j 6 中删除的 @Depth 注释迁移?

java - spring boot 如何使用 src/test/resource/中的 yaml 文件 Autowiring bean

java - 正则表达式在 JAVA 中抛出异常,在 PHP 中工作

JavaMail 不通过后缀发送 SMTP 电子邮件

java - SessionLocaleResolver和FixedLocaleResolver之间的确切区别是什么

java - Spring 在 http 请求正文中发送用户密码。在java中存储密码

spring - 在 Spring Boot 中添加多个跨源 URL