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

Java 我可以将其他Spring配置文件动态加载到现有的WebApplicationContext中吗?,java,spring,tomcat,migration,servletconfig,Java,Spring,Tomcat,Migration,Servletconfig,在Tomcat 6.0.18中启动我的webapp时,我只引导Spring初始化系统所需的东西,即,目前的数据库迁移。在迁移成功完成之前,我不希望加载系统的任何部分。这可以防止其他bean在操作甚至实例化之前必须等待迁移完成 我有一个startup-appcontext.xml,它配置了一个dbmigriondao,一个startupManager,它是一个,最后是一个FullSystemLauch bean。我通过setter注入将配置位置列表传递给fullsystemlaunchbean。f

在Tomcat 6.0.18中启动我的webapp时,我只引导Spring初始化系统所需的东西,即,目前的数据库迁移。在迁移成功完成之前,我不希望加载系统的任何部分。这可以防止其他bean在操作甚至实例化之前必须等待迁移完成

我有一个startup-appcontext.xml,它配置了一个dbmigriondao,一个startupManager,它是一个,最后是一个FullSystemLauch bean。我通过setter注入将配置位置列表传递给fullsystemlaunchbean。fullsystemlaunchbean实现,获取对当前的引用,因此我可以有一个。不幸的是,这个bean工厂isConfigurationFrozed()返回true,因此调用beanFactory.setConfigLocations(configLocations)没有效果

我能做到这一点吗?或者Spring阻止我这么做是因为它有点不同寻常吗?如果理解的话,这似乎是合理的,但也有点危险。是的,我愿意放弃当前的上下文b/c,一旦初始化完成,当前加载的单例就不需要了


谢谢您的帮助。

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

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


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

可能是您试图实现的目标的替代方案?

可能会对您有所帮助?

我的意见是,允许Spring在它认为合适的情况下,按照它们声明的依赖关系的顺序初始化您的bean

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

  • 如果您使用的是Hibernate/JPA,那么让您的sessionFactory/persistenceManager依赖于迁移bean
  • 如果您使用的是普通JDBC,请创建一个包装器数据源,并在其init方法中调用迁移()

优点很明显:简单。

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


别忘了提神

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

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

(startUpContext.xml使用标准spring上下文加载程序侦听器加载)

No;在初始化系统之前,每个bean中仍然必须有逻辑来阻止它实例化或“执行其工作”。为什么不将所有bean设置为惰性呢。然后创建一个holder bean,并将所有其他bean添加为依赖项。当您调用beanContext.getBean(“mybean”)时,所有bean都将被实例化。