【发布时间】:2020-05-27 03:19:34
【问题描述】:
如何在实现 org.flywaydb.core.api.migration.JavaMigration 的类中注入 Spring bean?
好像是在 Flyway 6.0 中添加的:This issue 好像在谈论它,但我真的不知道如何进行。
我也看到this answer 似乎在谈论它,但我希望有一个更短的解决方案(我没有作者所说的关于 JPA 依赖项的要求)。
谢谢
【问题讨论】:
如何在实现 org.flywaydb.core.api.migration.JavaMigration 的类中注入 Spring bean?
好像是在 Flyway 6.0 中添加的:This issue 好像在谈论它,但我真的不知道如何进行。
我也看到this answer 似乎在谈论它,但我希望有一个更短的解决方案(我没有作者所说的关于 JPA 依赖项的要求)。
谢谢
【问题讨论】:
假设您使用的是 Spring Boot:
spring.flyway.enabled 设置为false 来禁用flyway 的初始化和触发。这也意味着您必须自己配置 Flyway。@Component 注释您的 JavaMigrations 类。CommandLineRunner 并实现run 方法的类。此类还应该自动连接您的 JavaMigrations,并且您的数据源 URL、用户和密码也需要注入,或者注入 DataSource 对象。在 run 方法中,将您的 JavaMigrations 对象收集到一个数组中,并以编程方式将它们注册到 Flyway,然后运行迁移:
JavaMigrations migrations[] = {myJavaMigration};
Flyway flyway = Flyway.configure()
.dataSource(url, user, password)
.javaMigrations(migrations)
.load();
flyway.migrate();
全面实施:
@Component
public class MyJavaMigration extends BaseJavaMigration {
...
}
@Component
public class MyFlywayMigration implements CommandLineRunner {
@Autowired
private MyJavaMigration myJavaMigration;
@Autowired
private DataSource dataSource;
@Override
public void run(String... args) {
JavaMigrations migrations[] = {myJavaMigration};
Flyway flyway = Flyway.configure()
.dataSource(dataSource)
.javaMigrations(migrations)
.load();
flyway.migrate();
}
}
【讨论】:
spring.flyway.enabled =false。只要你的类路径中有myJavaMigration,上面的代码就可以简化为Flyway.configure().javaMigrations(myJavaMigration).load()。