news 2026/4/18 23:24:07

Spring Boot 自动配置原理与自定义 Starter 开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot 自动配置原理与自定义 Starter 开发实战

Spring Boot 自动配置原理

Spring Boot 自动配置的核心是通过条件化配置(@Conditional)实现。当满足特定条件时,相关的 Bean 会被自动加载到 Spring 容器中。

自动配置的触发依赖于spring-boot-autoconfigure模块中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件。该文件列出了所有自动配置类,Spring Boot 在启动时会加载这些配置类。

每个自动配置类通常包含以下内容:

  • @Configuration注解标记为配置类
  • @ConditionalOnClass@ConditionalOnProperty等条件注解控制是否生效
  • @EnableConfigurationProperties绑定外部配置
  • @Bean方法定义需要自动配置的 Bean

例如数据库自动配置:

@Configuration(proxyBeanMethods = false) @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @EnableConfigurationProperties(DataSourceProperties.class) public class DataSourceAutoConfiguration { @Bean @ConditionalOnMissingBean public DataSource dataSource(DataSourceProperties properties) { return properties.initializeDataSourceBuilder().build(); } }

自定义 Starter 开发步骤

创建自定义 Starter 需要两个模块:

  1. 自动配置模块(包含核心逻辑)
  2. Starter 模块(仅包含依赖)

自动配置模块开发

创建配置类:

@Configuration @ConditionalOnClass(MyService.class) @EnableConfigurationProperties(MyServiceProperties.class) public class MyServiceAutoConfiguration { @Bean @ConditionalOnMissingBean public MyService myService(MyServiceProperties properties) { return new MyService(properties.getPrefix()); } }

定义配置属性类:

@ConfigurationProperties("my.service") public class MyServiceProperties { private String prefix = "default"; // getters and setters }

resources/META-INF下创建:

  1. spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,内容为自动配置类的全限定名
  2. additional-spring-configuration-metadata.json用于配置提示

Starter 模块开发

Starter 只需包含对自动配置模块的依赖:

<dependencies> <dependency> <groupId>com.example</groupId> <artifactId>my-service-autoconfigure</artifactId> <version>1.0.0</version> </dependency> </dependencies>

最佳实践

命名规范遵循{name}-spring-boot-starter格式。例如自定义缓存 Starter 可命名为cache-spring-boot-starter

提供明确的配置元数据,帮助用户了解可用配置项:

{ "properties": [{ "name": "my.service.prefix", "type": "java.lang.String", "description": "Prefix for service output.", "defaultValue": "default" }] }

测试自动配置:

@SpringBootTest public class MyServiceAutoConfigurationTests { @Autowired(required = false) private MyService myService; @Test void serviceAutoConfigured() { assertThat(myService).isNotNull(); } }

调试技巧

启动时添加--debug参数可查看自动配置报告:

============================ CONDITIONS EVALUATION REPORT ============================ Positive matches: ----------------- MyServiceAutoConfiguration matched - @ConditionalOnClass found required class 'com.example.MyService'
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 7:28:28

上线前检查清单模板及工具指南:告别手忙脚乱,实现稳定发布

周五下午6点&#xff0c;所有人都盯着屏幕&#xff1a;“数据库脚本执行了吗&#xff1f;”“配置文件更新了没有&#xff1f;”“监控告警设置了么&#xff1f;”——这些问题像复读机一样在会议室回响。而最可怕的是&#xff0c;上线后发现&#xff1a;“完了&#xff0c;有个…

作者头像 李华
网站建设 2026/4/15 17:58:18

web智慧社区设计与实现信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着城市化进程的加速和信息技术的飞速发展&#xff0c;智慧社区成为提升居民生活质量、优化社区管理效率的重要方向。传统社区管理模式存在信息孤岛、管理效率低下、服务响应滞后等问题&#xff0c;难以满足现代居民对便捷化、智能化生活的需求。智慧社区信息管理系统通过…

作者头像 李华
网站建设 2026/4/18 14:42:15

什么是PROFINET

文章目录为什么需要PROFINETPROFINET IO系统有哪些组成PROFINET是如何工作的PROFINET采用TCP/IP协议作为基础&#xff0c;并在其应用层上增加了实时机制和通讯协议&#xff0c;因此具有和标准以太网相同的一些特性如全双工、多种拓扑结构等&#xff0c;其速率可达千兆。另外它也…

作者头像 李华
网站建设 2026/4/18 16:38:58

ΔΣ(Delta-Sigma)ADC 的原理---从“为什么要有 ΔΣ ADC → 它到底在干什么 → 每一块电路在物理层干了什么 → 为什么电表/计量芯片都爱用它”这个顺序,完整、工程化地讲清楚

一、先说结论&#xff08;抓住本质&#xff09;ΔΣ ADC 低分辨率量化器 过采样 噪声整形 数字滤波它的核心思想不是“一次采得很准”&#xff0c;而是&#xff1a;我一次采得很粗&#xff0c;但我采得非常快&#xff0c;而且把误差“挤”到高频&#xff0c;再用数字滤波丢…

作者头像 李华
网站建设 2026/4/18 7:15:07

密度敏感哈希(DSH)学习算法详解

密度敏感哈希(Density Sensitive Hashing,简称DSH)是一种无监督哈希学习方法,其独特之处在于考虑数据的密度分布,通过自适应选择分割超平面来生成二进制码。这种方法在高密度区域分配更多比特位,从而提升哈希码的区分能力,特别适合非均匀分布的数据集,如图像特征或文本…

作者头像 李华