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

时间:2009-06-20 15:59:31

标签: java spring tomcat migration servletconfig

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

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

我可以做到这一点,还是Spring阻止我这样做,因为它有点不同寻常?如果理解这似乎是合理的,但也有点危险。是的,我愿意吹掉当前的上下文b / c初始化完成后不需要当前加载的单例。

感谢您的帮助。

6 个答案:

答案 0 :(得分:3)

我的意见是允许Spring在它认为合适的情况下初始化你的bean - 按照它们声明的依赖项的顺序。

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

  • 如果你正在使用Hibernate / JPA,那么你的sessionFactory / persistenceManager 依赖迁移bean;
  • 如果您使用普通JDBC创建包装器DataSource并在其 init-method 中调用迁移(code sample

优点很明显:简单。

答案 1 :(得分:2)

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

如果您使用EAR-WAR打包,则可以通过从EAR加载应用程序上下文然后在WAR中添加一个应用程序上下文来获得此类开箱即用(

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

可能的XmlBeanDefinitionReader可以帮到你吗?

答案 4 :(得分:0)

您可以将WebApplicatonContext上传到ConfigurableWebApplicationContext 然后使用setConfigurations方法。

不要忘记刷新;

答案 5 :(得分:0)

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

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

(startUpContext.xml加载了标准的spring上下文加载器侦听器)