Skip to content

整体架构

模块组成

forge-ddlforge 的子模块,作为独立 jar 提供,业务模块只需在 pom.xml 引入即可生效。

装配链路

整条链路只触发一次,发生在 Spring Boot 启动尾声:

  1. 自动装配生效:classpath 上的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 前置知识 列出 DdlAutoConfiguration,被 Spring Boot 读入并作为 @Configuration 注册。

    这个 imports 文件到底是什么?

    Spring Boot 2.7+ 引入的自动装配清单,每行一个 @AutoConfiguration 类的全限定名。是对老的 META-INF/spring.factoriesEnableAutoConfiguration 项的替代品。Spring Boot 3.x 已彻底切换到该文件。 → 完整说明

  2. 组件扫描DdlAutoConfiguration 上的 @ComponentScan(basePackageClasses = DdlAutoConfiguration.class) 前置知识cn.cvking.forge.ddl 包下所有 @ComponentClazzScanner / ModelRegistry / DdlInitializer)注册为 Bean。

    为什么用 basePackageClasses 而不是 basePackages?

    basePackageClasses 通过类引用定位包,重构改名时不会失效;而 basePackages = "cn.cvking.forge.ddl" 写死字符串,重命名包后悄无声息地扫不到东西。Spring 官方推荐前者。

  3. 运行时触发扫描:所有 Bean 装配完毕后,Spring Boot 调用所有 ApplicationRunnerrun(...)DdlInitializer 在此时启动扫描。详见 扫描机制

关键依赖

forge-ddlpom.xml 只声明 4 个依赖:

GroupIdArtifactId用途
org.springframework.bootspring-boot-autoconfigure@AutoConfiguration / ApplicationRunner
org.springframeworkspring-contextClassPathScanningCandidateComponentProvider / AnnotationTypeFilter
org.slf4jslf4j-api日志门面,配合 Lombok @Slf4j
org.projectlomboklombok@Data / @Builder / @Slf4j(编译期生效)

框架本身不依赖任何 ORM(MyBatis / JPA / Hibernate),保证可独立演化。

设计取舍

选项选择理由
注解粒度「外层 + 嵌套子注解」既能区分语义又避免单注解参数膨胀,详见 注解模型设计
扫描根AutoConfigurationPackages.get(beanFactory)复用 Spring Boot 已记录的“用户基础包”,业务方零配置
注册中心内存 ConcurrentHashMap阶段①只读多写少,零外部依赖;后续如需要持久化可在外层加缓存
类型推导「子注解优先 + Java 类型兜底」兼顾“显式控制”与“零配置”,详见 扫描机制 · 类型推导