在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初始化完成后不需要当前加载的单例。
感谢您的帮助。
答案 0 :(得分:3)
我的意见是允许Spring在它认为合适的情况下初始化你的bean - 按照它们声明的依赖项的顺序。
如果您需要数据库迁移,可以先运行几种模式:
优点很明显:简单。
答案 1 :(得分:2)
您可以将现有上下文用作其他上下文的父上下文,但我怀疑您是否可以替换现有的WebApplicationContext。
如果您使用EAR-WAR打包,则可以通过从EAR加载应用程序上下文然后在WAR中添加一个应用程序上下文来获得此类开箱即用(
不确定这是否适用于您的情况。
答案 2 :(得分:0)
lazy-initialization可以替代你想要实现的目标吗?
答案 3 :(得分:0)
可能的XmlBeanDefinitionReader可以帮到你吗?
答案 4 :(得分:0)
您可以将WebApplicatonContext上传到ConfigurableWebApplicationContext 然后使用setConfigurations方法。
不要忘记刷新;
答案 5 :(得分:0)
有相同的任务,我创建了两个上下文:startUpContext.xml
和applicationContext.xml
。在startUpContext.xml
中有一个bean,它触发appliationContext.xml
的加载。 (应用程序上下文位置在startUpContext.xml
中配置为触发器的属性)。最后触发器替换当前上下文的位置并刷新它:
applicationContext.setConfigLocations(locations);
applicationContext.refresh();
(startUpContext.xml加载了标准的spring上下文加载器侦听器)