Мне не удалось найти способ выполнить миграцию на пути без создания bean-компонентов, но мне удалось избежать использования аннотации @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
, как в этот ответ .
Но вместо использования аннотации DependsOn
я добавил все bean-компоненты flyway в качестве зависимости к bean-компоненту LocalContainerEntityManagerFactoryBean
.
@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
}
Таким образом, нет необходимости в обновлении кода, когда пользователь решает исключить или включить модули, потому что каждый модуль имеет bean-компонент flyway, который будет создан, только если модуль включен в сборку.
Таким образом, мы также можем контролировать выполнение заказа на миграцию. Например, у нас может быть базовый модуль, от которого зависят другие модули, поэтому миграции из этого модуля должны выполняться в первую очередь. В этом сценарии мы могли бы обернуть конфигурации flyway в оболочку bean, которая будет содержать информацию об их заказе.
public class FlywayWrapper {
private Flyway flywayConfig;
private Integer order;
}
Перед выполнением миграций мы могли бы отсортировать их по их порядку.
flywayBeans.sort(Comparator.comparing(FlywayWrapper::getOrder));
flywayBeans.forEach(el -> el.getFlywayConfig().migrate());