我没有找到一种不创建flyway bean就执行flyway迁移的方法,但我确实设法避免了使用
@DependsOn
注释。
以下是我的飞豆的样子:
上载程序模块:
@Configuration
public class FlywayConfigUploader {
@Bean("flywayUploader")
public Flyway startMigrations() {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.setSchemas(schema);
flyway.setLocations(flywayLocation);
flyway.setSqlMigrationPrefix(prefix);
return flyway;
}
}
处理模块:
@Configuration
public class FlywayConfigProcessor {
@Bean("flywayProcessor")
public Flyway startMigrations() {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.setSchemas(schema);
flyway.setLocations(flywayLocation);
flyway.setSqlMigrationPrefix(prefix);
return flyway;
}
}
该项目目前有10个模块(因此有10个这样的立交桥配置)。将来模块的数量可能会增加。
我骑过了
LocalContainerEntityManagerFactoryBean
就像在
this answer
.
但不是使用
DependsOn
注释我添加了所有的Flyway bean作为对
本地ContainerEntityManagerFactoryBean
豆子。
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean
postgresEntityManagerFactory(EntityManagerFactoryBuilder builder, DataSource dataSource,
List<Flyway> flywayBeans) {
flywayBeans.forEach(el -> el.migrate());
//Rest of the code from the method is not relevant for the question
}
这样,当用户决定排除或包含模块时就不需要进行代码更新,因为每个模块都有一个Flyway bean,只有当模块包含在构建中时才会创建该bean。
通过这种方式,我们还可以控制Flyway迁移的订单执行。例如,我们可能有一个其他模块依赖的基本模块,因此必须首先执行来自该模块的迁移。在这种情况下,我们可以将Flyway配置包装在包装bean中,包装bean将包含有关其顺序的信息。
public class FlywayWrapper {
private Flyway flywayConfig;
private Integer order;
}
在执行迁移之前,我们可以按顺序对它们进行排序。
flywayBeans.sort(Comparator.comparing(FlywayWrapper::getOrder));
flywayBeans.forEach(el -> el.getFlywayConfig().migrate());