代码之家  ›  专栏  ›  技术社区  ›  Elliot

我可以动态地将其他Spring配置文件加载到现有的WebApplicationContext中吗?

  •  7
  • Elliot  · 技术社区  · 16 年前

    在Tomcat6.0.18中启动我的webapp后,我启动Spring,只需要 初始化 系统——也就是现在的数据库迁移。在迁移成功完成之前,我不希望加载系统的任何部分。这可以防止其他bean在操作之前,甚至在实例化之前,必须等待迁移完成。

    我有一个startup-appcontext.xml配置了一个dbmigrationdao,一个startupmanager,它是 ThreadPoolExecutor 最后是一个完整的系统lauch bean。我通过setter注入将配置位置列表传递给fullsystemlaunch bean。fullsystemlaunch bean实现 ServletContextAware ,获取对当前 WebApplicationContext 这样我就可以 ConfigurableListableBeanFactory .不幸的是,此bean工厂isconfigurationforned()返回true,因此通过调用bean factory.setconfigulocations(configulocations)没有任何效果。

    我能做到这一点吗?还是因为有点不寻常,春天阻止了我这样做?这似乎是合理的,如果理解,但也有点危险。是的,我愿意将当前的上下文b/c吹走,一旦初始化完成,就不需要当前加载的单例。

    谢谢你的帮助。

    6 回复  |  直到 16 年前
        1
  •  2
  •   Maarten Winkels    16 年前

    您可以将现有上下文用作其他上下文的父上下文,尽管我怀疑您是否可以替换现有的WebApplicationContext。

    如果您使用EAR-War打包,那么您可以通过从EAR中加载应用程序上下文,然后在WAR中添加一个来实现这一点。

    不确定这是否适用于您的情况。

        2
  •  3
  •   Community Mohan Dere    8 年前

    我的观点是允许Spring按照它们声明的依赖项的顺序初始化您的bean。

    如果需要数据库迁移,可以先运行以下几种模式:

    • 如果您正在使用hibernate/jpa,请将sessionFactory/persistencemanager设为 依靠 迁移豆;
    • 如果您使用的是纯JDBC,请创建一个包装数据源,并在它的 初始化法 调用迁移( code sample )

    优点很明显:简单。

        3
  •  0
  •   kgiannakakis    16 年前

    可以 lazy-initialization 成为你想要实现的目标的替代品?

        4
  •  0
  •   FoxyBOA    16 年前

    可能的 XmlBeanDefinitionReader 能帮助你吗?

        5
  •  0
  •   user175905    16 年前

    可以将WebApplicationContext升级为可配置的WebApplicationContext 然后使用setconfigurations方法。

    不要忘记刷新;

        6
  •  0
  •   Serge Bogatyrev    16 年前

    有相同的任务,我创建了两个上下文: startUpContext.xml applicationContext.xml . 在 启动上下文.xml 有一个bean,它触发加载 appliationContext.xml . (应用程序上下文位置配置在 启动上下文.xml 作为触发器的属性)。最后触发 替换 当前上下文的位置并刷新它:

    applicationContext.setConfigLocations(locations);
    applicationContext.refresh();
    

    (StartupContext.xml与标准Spring上下文加载程序侦听器一起加载)