【问题标题】:Initialize beans after application startup/on application event [spring]在应用程序启动/应用程序事件后初始化 bean [spring]
【发布时间】:2017-01-31 03:26:01
【问题描述】:

我有以下情况。在我的微服务 [MA] 中,我想在应用程序启动后或基于某些事件初始化/销毁一些 bean。想象一下,还有另一个微服务 [MB] 保存有关 ContentStores 的信息。 MA 启动后,我想向 MB 询问 contentStore 条目,并基于此我想根据需要创建那么多 bean。可能会有触发 storeCreated/storeDeleted 的事件,在这种情况下,我需要销毁 bean。

我目前不知道我需要实现哪些接口/类扩展,所以请给我一些建议。

让我们从ApplicationListener 和事件ApplicationReadyEvent 开始。有了这两个,我知道 MA 已初始化,我可能可以向 MB 询问商店列表。

在这个地方,我可以利用事件的 applicationContext 并创建 bean(每个 bean 都有自己的限定符 - 例如 ID),如果需要,可以自动装配它们的依赖关系。

但是从这个地方我不知道如何将创建的 bean 添加到 ApplicationContext。

应用程序事件应该存在相同的机制,但在这种情况下,我可能首先检查是否创建了 bean,如果是,则返回它们。

注意:我使用的是 spring-boot 1.4。

谢谢

【问题讨论】:

  • 您是否考虑过使用子应用程序上下文?然后您可以刷新它以创建 bean 并关闭它以销毁它们。您将如何创建 bean 将取决于您的要求。您能描述一下您需要创建的 bean 吗?是否有固定的已知数量的 bean,而您只需要其他服务的一些配置,或者 bean 的数量会有所不同?
  • 嗨,Andy,bean 的数量是变化的,取决于第二个服务。基本上会有 1-n 个内容存储,我需要在应用程序启动时或在远程服务中创建新的 contentStore 条目时实例化它们。那时可能会出现 contentStore 被删除的情况,所以我需要从应用程序中删除该 bean。
  • @AndyWilkinson 你能看看this吗?

标签: spring spring-boot


【解决方案1】:

我想在应用程序启动后或基于某些事件初始化/销毁一些 bean。

对于这个问题,你可以通过org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor注册一个bean来注册一个BeanDefinition

另一种方法是在 bean 中使用 @PostConstruct -“PostConstruct 注释用于在完成依赖注入以执行任何初始化后需要执行的方法。”

对于应用退出,可以在这里使用应用退出钩子——doc

【讨论】:

  • BeanDefinitionRegistryPostProcessor 什么时候执行?是开始申请的时间吗?如果是这样,我不能使用它,因为我在运行应用程序时也需要这个过程。
  • @bilak 它在上下文refresh() 阶段调用它,所以可以这样做然后执行ConfigurableApplicationContext#refresh() 来加载所有的bean,那么backing bean factory 将被覆盖并且创建了一个新的。
  • 你能看看here。当您执行 mvn spring-boot:run 时,您可以看到问题。我在 ContentStoreInitializer 中初始化 bean。但是当我尝试在 FileSystemContentStoreService 中访问它们时,我无法获取它们。我不明白我是否以正确的方式创建和访问它们。谢谢
  • 我已经解决了这个问题,但我认为这不是最干净的解决方案。可能有一种更简单的方法来做到这一点。
  • @bilak 抱歉,周末错过了您的留言,如果您有更好的解决方案,请分享给我们,谢谢。
猜你喜欢
  • 2011-01-23
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多