ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spring Boot Starter机制与自定义详解

Spring Boot Starter机制与自定义详解 Spring Boot Starter机制与自定义详解定位第 03 篇讲透 Starter 的双模块结构、命名约定、依赖版本管理以及从零自定义一个 Starter 的完整流程适用版本Spring Boot 3.xJDK 17目录一、Starter 的结构二、命名约定三、依赖管理四、自定义 Starter 流程五、配置提示六、总结七、常见高频面试题一、Starter 的结构一个标准 Starter 由两个模块组成可拆开也可合并xxx-spring-boot-starter ← 依赖聚合空壳 pom └── 依赖 xxx-spring-boot-autoconfigure ← 真正的逻辑 ├── XxxAutoConfiguration.java 自动配置类 ├── XxxProperties.java 配置属性类 └── META-INF/spring/...AutoConfiguration.imports 清单模块职责xxx-spring-boot-starter只声明依赖聚合 autoconfigure 模块 该功能需要的第三方库xxx-spring-boot-autoconfigure自动配置类、属性类、清单文件拆分的好处用户只想要依赖聚合不想要自动配置或反之时可选择性引入简单场景也可合成一个模块。本质Starter “依赖清单 自动配置”把引入依赖 写配置两步压缩成引一个坐标。二、命名约定来源格式例官方spring-boot-starter-{功能}spring-boot-starter-web第三方/自定义{功能}-spring-boot-startermybatis-spring-boot-starter官方保留spring-boot-starter-前缀给自身自定义不要用该前缀开头社区约定便于区分来源。三、依赖管理3.1 版本仲裁的两种方式方式一继承 parent artifactIdspring-boot-starter-parent/artifactId /parent → 获得依赖版本仲裁 插件默认配置 资源过滤 方式二BOM import不继承时用 dependencyManagement dependency artifactIdspring-boot-dependencies/artifactId ← 纯 BOM typepom/typescopeimport/scope /dependency /dependencyManagement → 只获得版本仲裁不带 parent 的插件/资源默认3.2 覆盖仲裁BOM 里的版本是推荐且经过联合测试的默认确需不同版本时显式声明版本即可覆盖parent 方式下改 properties 里的版本号。原则默认跟 BOM升级先改 BOM 版本而不是单点覆盖——单点覆盖容易引入未联合测试的组合。四、自定义 Starter 流程以短信发送客户端为例五步4.1 定义配置属性类ConfigurationProperties(prefixdemo.sms)publicclassSmsProperties{privateStringaccessKey;privateinttimeoutMs3000;// 默认值// getter/setter}4.2 写自动配置类AutoConfigurationConditionalOnClass(SmsClient.class)// 有核心库才装配EnableConfigurationProperties(SmsProperties.class)publicclassSmsAutoConfiguration{BeanConditionalOnMissingBean// 用户自定义则让位publicSmsClientsmsClient(SmsPropertiesprops){returnnewSmsClient(props.getAccessKey(),props.getTimeoutMs());}}4.3 注册清单# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports com.demo.sms.SmsAutoConfiguration4.4 打依赖聚合模块demo-sms-spring-boot-starter的 pom 依赖autoconfigure 模块 短信核心库。4.5 使用方引入 demo-sms-spring-boot-starter 配置 demo.sms.access-keyxxx Autowired SmsClient 直接用设计纪律条件要齐OnClass/OnMissingBean属性有默认值与校验提供排除手段文档写明属性清单——好 Starter 的标准。五、配置提示引入注解处理器构建时生成元数据让 IDE 提示自定义属性依赖spring-configuration-processor 产物META-INF/spring-configuration-metadata.json 效果application.yml 里输 demo.sms. 有属性名/类型/默认值提示这是自定义 Starter 的专业度体现成本低收益明显。六、总结结构Starter 依赖聚合模块 自动配置模块配置类/属性类/清单本质是引一个坐标完成依赖配置。命名官方spring-boot-starter-x第三方x-spring-boot-starter。版本管理parent 继承或 BOM import 二选一默认跟 BOM升级改 BOM 而非单点覆盖。自定义五步属性类 → 自动配置类条件齐全→ imports 清单 → 聚合模块 → 使用方引依赖配属性。体验增强configuration-processor 生成元数据供 IDE 提示。七、常见高频面试题1. Starter 的组成部分是什么要点标准 Starter 含两个模块——依赖聚合模块xxx-spring-boot-starter主要是 pom聚合 autoconfigure 与所需第三方库和自动配置模块xxx-spring-boot-autoconfigure含 AutoConfiguration 配置类、ConfigurationProperties 属性类、AutoConfiguration.imports 清单。简单场景可合并为一个模块。本质把引入一组协调依赖 自动装配默认 Bean封装成单个坐标开箱即用。2. 官方和第三方 Starter 的命名约定要点官方用 spring-boot-starter-{功能}如 spring-boot-starter-webSpring Boot 团队保留该前缀第三方/自定义用 {功能}-spring-boot-starter如 mybatis-spring-boot-starter。约定便于区分来源与归属自定义不要占用官方前缀。名字即文档从坐标就能看出它提供什么能力。3. spring-boot-starter-parent 和 spring-boot-dependencies 的区别要点spring-boot-dependencies 是纯 BOM只负责依赖版本仲裁spring-boot-starter-parent 继承自它额外提供 Maven 插件默认配置、资源过滤、编译参数等构建默认。使用方式继承 parent 一步到位不能/不想继承如公司已有父 POM时用 dependencyManagement import BOM 只拿版本仲裁。两者都保证依赖版本经过联合测试。4. 如何自定义一个 Starter要点五步。① ConfigurationProperties 定义配置属性类前缀绑定、默认值② AutoConfiguration 写自动配置类配 ConditionalOnClass/OnProperty/OnMissingBean 条件Bean 注册核心对象③ 把类名写入 META-INF/spring/…AutoConfiguration.imports④ 建依赖聚合模块引 autoconfigure 与核心库⑤ 使用方引该 starter、配置属性即自动装配。可用 exclude 排除、自定义同类型 Bean 覆盖。5. 为什么自定义 Starter 要用 ConditionalOnMissingBean要点保证用户优先——使用方若自定义了同类型 Bean如定制化的客户端自动配置检测到已存在即让位不重复注册也不冲突。这是 Starter 可覆盖性的核心默认开箱即用但处处允许定制。不加该条件会导致与用户定义冲突或产生重复 Bean。同理 ConditionalOnClass 保证缺核心依赖时不乱装。6. 版本冲突时BOM 仲裁和显式声明谁赢要点就近原则下显式声明的版本覆盖 BOM 仲裁结果parent 方式可通过 properties 覆盖 BOM 中的版本属性。但应谨慎BOM 的版本组合经过联合测试单点覆盖可能引入不兼容组合。正确姿势优先升级 BOM 整体版本获得协调的新版本确需单点覆盖时充分回归测试。依赖树可用 mvn dependency:tree 核对实际生效版本。7. spring-configuration-metadata.json 是干什么的要点配置元数据文件描述可配置属性名称、类型、默认值、说明。由 spring-configuration-processor 注解处理器在构建时从 ConfigurationProperties 类生成。作用IDE 在 application.yml 中提供属性自动补全、类型校验与文档提示显著提升使用方体验。自定义 Starter 应引入该处理器这是专业度的体现。8. 引入一个 Starter 后它是如何自动生效的要点链路回顾衔接 BT-02——Starter 的 autoconfigure 模块带 AutoConfiguration.imports 清单应用启动时 EnableAutoConfiguration 的 ImportSelector 聚合所有 jar 的清单把候选自动配置类注册各类按 Conditional 条件OnClass 满足、属性具备、OnMissingBean 无用户定义决定是否真正装配 Bean。所以引依赖即生效 清单被聚合 条件满足。9. 一个自动配置模块能不能不拆 starter 直接给用户用要点技术上可以合并为一个模块用户引该模块也能触发自动配置。拆分的价值依赖聚合与自动配置关注点分离用户可选择只要依赖不要自动配置或反向符合官方生态惯例便于排除与替换。简单内部库合并即可面向广泛使用、需要灵活组合的建议按标准双模块拆分。10. 设计一个好用的 Starter 有哪些要点要点① 条件齐全OnClass依赖门禁、OnMissingBean可覆盖、OnProperty开关② 属性友好前缀清晰、有默认值、可校验Validated、生成配置元数据供 IDE 提示③ 可退出支持 exclude 排除与自定义 Bean 覆盖不强制接管④ 文档完整属性清单、默认行为、排除方式⑤ 无副作用不在装配期做重操作建连接等延迟到使用时。
返回列表