8

在 Tomcat 6.0.18 中启动我的 web 应用程序后,我只使用初始化系统所需的东西来引导 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 一旦初始化完成,就不需要当前加载的单例。

感谢您的帮助。

4

6 回答 6

3

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

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

  • 如果您使用的是 Hibernate/JPA,请让您的 sessionFactory/persistenceManager依赖于迁移 bean;
  • 如果您使用的是普通 JDBC,请创建一个包装器 DataSource 并在其init 方法中调用迁移(代码示例

优点很明显:简单。

于 2009-06-23T06:59:26.483 回答
2

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

如果您使用 EAR - WAR 打包,您可以通过从 EAR 加载应用程序上下文然后在 WAR 中添加一个来获得这种开箱即用的(有点)。

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

于 2009-06-21T15:22:41.203 回答
0

延迟初始化可以替代您想要实现的目标吗?

于 2009-06-22T10:19:31.203 回答
0

可能的 XmlBeanDefinitionReader可以帮助你吗?

于 2009-06-23T06:40:05.957 回答
0

您可以将 WebApplicatonContext 升级到 ConfigurableWebApplicationContext 然后使用 setConfigurations 方法。

不要忘记刷新;

于 2009-09-19T10:27:53.123 回答
0

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

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

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

于 2009-09-19T10:42:17.743 回答