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

发布于 2024-07-25 06:01:13 字数 1240 浏览 11 评论 0 原文

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

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

我可以完成这个任务吗?还是 Spring 阻止我这样做,因为它有点不寻常? 理解起来似乎很有道理,但也有点危险。 是的,我愿意清除当前上下文,因为初始化完成后不需要当前加载的单例。

感谢您的帮助。

Upon starting my webapp within Tomcat 6.0.18, I bootstrap Spring with only what is necessary to initialize the system -- namely, for now, database migrations. I do not want any part of the system to load until the migrations have successfully completed. This prevents the other beans from having to wait on the migrations to complete before operating, or even instantiating.

I have a startup-appcontext.xml configured with a dbMigrationDAO, a startupManager which is a ThreadPoolExecutor, and lastly, a FullSystemLauch bean. I pass a list of configuration locations to the FullSystemLaunch bean via setter injection. The FullSystemLaunch bean implements ServletContextAware, gets a reference to the current WebApplicationContext and thus I can have a ConfigurableListableBeanFactory. Unfortunately, this bean factory isConfigurationFrozen() returns true, so by calling beanFactory.setConfigLocations(configLocations) has no effect.

Can I accomplish this or is Spring preventing me from doing so because it's a bit out of the ordinary? It seems reasonable if understood, but also a bit dangerous. And yes, I'm willing to blow away the current context b/c the currently loaded Singletons are not needed once initialization is complete.

Thank you for the help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

划一舟意中人 2024-08-01 06:01:13

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

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

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

优点很明显:简单。

My opinion would be to allow Spring to initialise your beans is it sees fit - in the order of their declared dependencies.

If you need database migrations there are a couple of patterns to have them run first:

  • if you're using Hibernate/JPA make your sessionFactory/persistenceManager depend-on the migration beans;
  • if you're using plain JDBC create a wrapper DataSource and in its init-method invoke the migrations ( code sample)

The advantage is clear: simplicity.

雨的味道风的声音 2024-08-01 06:01:13

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

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

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

You could use the existing context as parent context for the other contexts, although I doubt that you could replace the existing WebApplicationContext.

If you use EAR - WAR packaging, you get this out-of-the-box (sort of) by loading an application context from the EAR and then adding one in the WAR.

Not sure whether this is applicable in your situation.

情栀口红 2024-08-01 06:01:13

Could lazy-initialization be an alternative for what you are trying to achieve?

桃气十足 2024-08-01 06:01:13

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

不要忘记刷新;

you can upcat the WebApplicatonContext to ConfigurableWebApplicationContext
then use the setConfigurations method.

dont forget refresh;

鼻尖触碰 2024-08-01 06:01:13

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

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

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

There was the same task and I created two contexts: startUpContext.xml and applicationContext.xml. In startUpContext.xml there is a bean, which triggers loading of appliationContext.xml. (application context location is configured in startUpContext.xml as a property of a trigger). And finally the trigger replaces locations of the current context and refreshes it:

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

(startUpContext.xml is loaded with a standard spring context loader listener)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文