SpringBoot Starter 自动装配完整原理 + 实战
SpringBoot Starter 自动装配完整原理 实战一、什么是自动装配传统 SSM 开发需要手动 XML/JavaConfig 配置 Bean、导入第三方组件、管理依赖。SpringBoot 自动装配引入依赖后Spring 容器自动识别并注册所需 Bean业务工程零配置、无需手动 new、无需 Bean。我们封装自定义 Starter 的核心就是实现自定义自动装配分为两大核心机制SPI 扩展文件META-INF/spring.factoriesSpringBoot 2.x 主流方式条件注解按需装配不存在对应类 / 配置就不创建 Bean二、自动装配底层核心原理2.1 启动入口SpringBootApplicationSpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }SpringBootApplication组合注解包含EnableAutoConfiguration这是自动装配开关。2.2 EnableAutoConfiguration 工作流程通过AutoConfigurationImportSelector类读取所有 Jar 包下META-INF/spring.factories读取文件中EnableAutoConfiguration对应的配置类全类名列表使用条件注解过滤不满足环境的配置类满足条件的配置类内部通过Bean注册组件到 Spring 容器。2.3 完整流程图引入 starter 依赖 → 加载 spring.factories → 读取自定义自动配置类 → 条件注解判断环境 → 注册工具类、切面、过滤器等 Bean。三、实现自动装配三步走实战基于限流幂等 Starter步骤 1编写自动配置类核心配置类作用统一声明需要交给 Spring 管理的 Bean配合条件注解实现按需加载。package com.security.starter.config; import com.security.starter.aop.IdempotentAspect; import com.security.starter.core.IdempotentUtil; import com.security.starter.prop.SecurityProperties; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; /** * 自定义自动装配主配置类 */ Configuration // 开启yml配置属性绑定把配置注入SecurityProperties EnableConfigurationProperties(SecurityProperties.class) // 条件注解yml中 security.framework.enabletrue 才加载整套组件不配置默认开启 ConditionalOnProperty( prefix security.framework, name enable, havingValue true, matchIfMissing true ) // 导入子配置Sentinel Nacos持久化配置 Import(SentinelNacosAutoConfig.class) public class SecurityAutoConfiguration { /** * 注册幂等工具类 * ConditionalOnMissingBean业务工程如果自己注入了IdempotentUtil则优先使用业务自定义Bean */ Bean ConditionalOnMissingBean public IdempotentUtil idempotentUtil() { return new IdempotentUtil(); } /** * 注册幂等AOP切面 */ Bean ConditionalOnMissingBean public IdempotentAspect idempotentAspect() { return new IdempotentAspect(); } }常用条件注解说明自动装配灵魂注解作用使用场景ConditionalOnClassclasspath 存在指定类才生效依赖 Redis 才装配 Redis 工具ConditionalOnMissingBean容器没有该 Bean 才创建允许业务自定义覆盖默认组件ConditionalOnPropertyyml 配置匹配才生效总开关控制整套 Starter 启停ConditionalOnWebApplicationWeb 环境才装配区分普通工程 / 网关响应式工程ConditionalOnResourceclasspath 存在指定文件才加载读取自定义资源文件步骤 2配置属性绑定类读取 yml 自定义参数通过ConfigurationProperties绑定 yml 配置EnableConfigurationProperties在配置类开启绑定。package com.security.starter.prop; import org.springframework.boot.context.properties.ConfigurationProperties; ConfigurationProperties(prefix security.framework) public class SecurityProperties { private boolean enable true; private String idempotentPrefix idempotent:token:; private String nacosGroup SENTINEL_GROUP; // getter、setter }步骤 3创建 SPI 文件 spring.factories关键缺一不可路径固定src/main/resources/META-INF/spring.factories文件内容格式key 值列表逗号分隔多个配置类key 固定为org.springframework.boot.autoconfigure.EnableAutoConfigurationvalue 填写我们自定义自动配置类完整全限定名factories# 自动装配注册自定义配置类 org.springframework.boot.autoconfigure.EnableAutoConfiguration\ com.security.starter.config.SecurityAutoConfiguration原理SpringBoot 启动时扫描所有 Jar 包的该文件自动加载右侧配置类无需业务工程加任何EnableXXX注解。四、测试验证自动装配是否生效4.1 Starter 打包执行 Maven 命令将自定义 starter 打包安装到本地仓库mvn clean install -DskipTests4.2 业务工程引入依赖dependency groupIdcom.security/groupId artifactIdsecurity-spring-boot-starter/artifactId version1.0.0/version /dependency4.3 测试注入直接在 Controller 注入工具类不需要任何配置能正常注入即代表自动装配成功RestController public class TestController { // 自动装配生效直接注入 Resource private IdempotentUtil idempotentUtil; GetMapping(/test) public ResultString test() { String token idempotentUtil.generateToken(600); return Result.success(token); } }4.4 开关测试在 yml 关闭组件验证 Bean 不再注入security: framework: enable: false启动项目注入IdempotentUtil会报No qualifying bean说明条件注解生效。五、两种自动装配模式对比模式 1spring.factories 自动装配推荐本文方案优点业务项目无需添加任何启动注解引入依赖即生效开箱即用适用通用基础组件、封装 Starter、中间件集成。模式 2自定义 EnableXXX 注解手动开启创建注解EnableSecurityFramework注解内部Import(SecurityAutoConfiguration.class)业务启动类添加EnableSecurityFramework才会加载配置优点可控性强需要手动显式开启缺点多一行代码自动化程度低适用可选扩展组件、复杂业务模块。示例手动开启模式Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Import(SecurityAutoConfiguration.class) public interface EnableSecurityFramework { }业务启动类使用SpringBootApplication EnableSecurityFramework public class OrderApplication { }六、企业级进阶优化点6.1 兼容存在 Redis 才装配幂等工具增加ConditionalOnClass(RedisTemplate.class)无 Redis 依赖时不创建 Bean避免启动报错Bean ConditionalOnClass(RedisTemplate.class) ConditionalOnMissingBean public IdempotentUtil idempotentUtil() { return new IdempotentUtil(); }6.2 支持业务自定义覆盖默认组件全部Bean增加ConditionalOnMissingBean业务项目自己定义同名 Bean 时会覆盖 Starter 内部默认实现扩展灵活。6.3 配置元数据IDE 自动提示引入配置处理器依赖自动生成配置提示文件编写 yml 时有提示dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-configuration-processor/artifactId optionaltrue/optional /dependency6.4 拆分多配置类模块化管理Sentinel 配置独立SentinelNacosAutoConfig幂等核心配置SecurityAutoConfiguration使用Import导入解耦代码便于维护。七、常见自动装配踩坑坑 1spring.factories 路径 / 类名写错装配失效目录必须是resources/META-INF大小写不能错类名必须写完整全限定名包名、类名不能少换行使用\结尾不能有多余空格。坑 2yml 配置无法注入 Properties缺少EnableConfigurationPropertiesConfigurationProperties前缀与 yml 不匹配缺少 get/set 方法无法反射赋值。坑 3条件注解不生效Bean 不该创建却创建检查注解参数matchIfMissing、havingValue配置是否正确。坑 4引入 starter 后启动报类找不到Starter pom 依赖 scope 不能设为 provided必须默认 compile业务工程才能传递依赖。八、总结自动装配核心入口EnableAutoConfiguration通过 SPI 文件spring.factories加载配置类三大核心组成自动配置类 配置属性绑定 SPI 注册文件条件注解是自动装配的核心实现按需加载、环境兼容、业务自定义覆盖封装通用 Starter 优先使用 spring.factories 方式实现引入依赖零配置开箱即用完整流程编写配置类 → 绑定 yml 参数 → 配置 spring.factories → 打包测试。