Flyway 6 JavaMigrations是否支持Spring Bean原生依赖注入?如何实现?
嘿,你提到的Flyway 6及以上版本支持Java迁移类原生依赖注入Spring Bean的说法完全属实!之前靠@DependsOn或者ApplicationContextAware绕弯子的方案确实能用,但Flyway从6版本开始已经把这个特性做进了原生支持里,用起来顺手多了。
下面是具体的实现步骤,以Spring Boot环境为例(非Boot环境原理类似,只要确保Flyway能接入Spring上下文):
1. 确保版本兼容
首先要保证你的Flyway版本在6.0以上,Spring Boot建议搭配2.2及以上版本(新版本的组合肯定没问题,不用太纠结具体号,只要别用太老的就行)。
2. 编写可注入的Java迁移类
和之前写Java迁移类的区别只有一点:把迁移类标记为Spring Bean,然后就可以像普通Bean一样注入依赖了。
举个实际的例子:
import org.flywaydb.core.api.migration.BaseJavaMigration; import org.flywaydb.core.api.migration.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; // 关键:加@Component让Spring管理这个Bean @Component public class V1_0_2__Init_User_Defaults extends BaseJavaMigration { // 直接注入你的业务Bean private final UserService userService; // 推荐用构造器注入(符合Spring最佳实践,也避免空指针) @Autowired public V1_0_2__Init_User_Defaults(UserService userService) { this.userService = userService; } @Override public void migrate(Context context) throws Exception { // 在这里直接用注入的Bean做操作就行 userService.batchInitDefaultUserSettings(); } }
注意:迁移类的命名还是要遵守Flyway的规则——V<版本号>__<描述>,不然Flyway会识别不到这个迁移。
3. 无需额外配置(Spring Boot环境)
Spring Boot的Flyway自动配置已经帮你做好了上下文对接:它会自动扫描Spring容器中所有实现了JavaMigration接口的Bean,把它们纳入Flyway的迁移流程,而且这些Bean在执行migrate方法前已经完成了依赖注入。
如果是非Spring Boot环境,你需要手动把Flyway和Spring上下文绑定,比如在配置Flyway时传入ApplicationContext,不过这种场景现在比较少见了。
为什么这个方案更好?
对比之前的ApplicationContextAware或者@DependsOn方案:
- 不用手动去上下文里捞Bean,代码更简洁,符合Spring的依赖注入思想
- 无需担心Bean的初始化顺序,Spring会帮你处理好依赖关系
- 迁移类的测试和普通Bean一样方便,直接Mock依赖就行
内容的提问来源于stack exchange,提问作者mararn1618

