【问题标题】:How to initialize Spring bean at very beginning of Spring initialization?如何在 Spring 初始化的一开始就初始化 Spring bean?
【发布时间】:2017-03-17 12:42:29
【问题描述】:

我想在我的 Spring Boot 应用程序 flywaydb 中使用 SQL 在初始化时更改文件来更新/初始化数据库。 Java 代码,即 Flywaydb 进程,应在创建 Spring datasource 之后执行(Flywaydb 需要 javax.sql.DataSource)但在初始化应用程序 bean 之前执行。我知道 @DependsOn 注释芽,我不想避免在所有应用程序 bean 上设置它。

有什么方法可以按指定的顺序初始化特定的bean吗?

【问题讨论】:

标签: java spring initialization


【解决方案1】:

只是不要做任何特别的事情。 Spring Boot 有support for Flyway out-of-the-box。只需三个步骤

  1. 添加Flyway作为依赖
  2. 将您的迁移脚本放入src/main/resources/db/migration
  3. 开始您的应用程序

您不需要添加注释、创建 bean 或使用回调。 Spring Team 已经想到了这一点。

【讨论】:

  • 完美!像魅力一样工作。
【解决方案2】:

如果您希望在应用程序准备好启动时只发生一次 bean 回调,那么所有 bean 都已准备好并且在刷新上下文时不会再次被调用,那么一个好的 Spring Boot 方法是使用 ApplicationReadyEvent 之类的这个:

@EventListener(ApplicationReadyEvent.class)
public void onApplicationEvent(ApplicationReadyEvent event) {
  // do tasks that should happen once on startup
}

【讨论】:

  • 不,我需要在所有其他 bean 准备好之前调用我的代码 - 因为这取决于我之前需要实现的实际数据库结构。
  • 好的,那么也许您需要context initializer?我自己使用了ApplicationStartedEvent 来检索其余上下文所依赖的关键数据。
猜你喜欢
  • 1970-01-01
  • 2023-03-02
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多