【问题标题】:Execute sth. after or before bean is created执行某事。在创建 bean 之后或之前
【发布时间】:2015-06-27 01:36:22
【问题描述】:

我将spring-boot 与flyway 和一个数据源一起使用,因此两个bean 都由spring-boot 自动配置。现在我想直接在数据源之后或在flyway bean初始化之前执行foo(一些代码/一个SQL脚本)。

如何在外部配置 - 最好使用注释 - 应该调用 flyway dependsOn fooBean 或数据源 foo 的 post 构造?

尝试更改 bean 初始化顺序或注册 ApplicationListener(如果可能)是“更好”的方法吗?

【问题讨论】:

  • 一些代码/一个 SQL 脚本。
  • 你的意思是“某事”吗?
  • 不能……只需使用正确的版本就可以直接由flyway执行? flyway可以同时执行SQL和java,如果需要它还支持乱序执行。
  • 其实每次启动应用我都想清理一下数据库。

标签: spring initialization spring-boot


【解决方案1】:

我想唯一的解决方案是覆盖 Flyway 配置并添加“干净”方法调用。所以像这样创建你自己的 FlywayConfig 类:

@Configuration
public class FlywayConfig {

    @Autowired
    private FlywayProperties properties = new FlywayProperties();

    @Autowired(required = false)
    @FlywayDataSource
    private DataSource flywayDataSource;

    @Autowired(required = false)
    private DataSource dataSource;

    @Bean(initMethod = "migrate")
    public Flyway flyway() {
        Flyway flyway = new Flyway();
        if (this.properties.isCreateDataSource()) {
            flyway.setDataSource(this.properties.getUrl(), this.properties.getUser(),
                    this.properties.getPassword(), this.properties.getInitSqls()
                            .toArray(new String[0]));
        }
        else if (this.flywayDataSource != null) {
            flyway.setDataSource(this.flywayDataSource);
        }
        else {
            flyway.setDataSource(this.dataSource);
        }
        flyway.clean(); // <-- this drops the schema
        return flyway;
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2011-02-11
  • 2017-03-28
  • 2011-01-16
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多