当前位置: 首页 > news >正文

SpringBoot 自动配置完整原理

SpringBoot 自动配置核心目的是无需手动写大量 XML / @Bean 配置,根据项目依赖、类是否存在、容器有无 Bean,自动装配全套组件,整套机制依托三大核心:@EnableAutoConfigurationAutoConfigurationImportSelectorMETA-INF/spring.factories、条件注解。我分四层讲清楚完整流程。

一、入口:@SpringBootApplication 复合注解

@SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration

自动配置开关来自@EnableAutoConfiguration,核心逻辑全在这个注解里。 点进源码:

@Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {}

@Import导入选择器类,这是自动配置的核心入口。

二、核心类:AutoConfigurationImportSelector(自动配置选择器)

它实现了DeferredImportSelector,Spring 扫描配置类时会执行selectImports()方法,核心做两件事:

  1. 读取所有 jar 包下资源文件:META-INF/spring.factories
  2. 在文件中查找 key =org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的所有自动配置类全类名;

示例 spring.factories 片段:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration

SpringBoot 内置了上百个场景自动配置类,数据库、MVC、Redis、Tomcat 全部在这里定义。

三、条件注解:按需生效,避免无脑加载所有配置

拿到所有自动配置类后,不会全部直接加载,每个配置类头部都带条件注解,不满足条件直接跳过,这是 “自动” 的关键。

常用核心条件注解:

  1. @ConditionalOnClass:classpath 存在指定类才生效 例:RedisAutoConfiguration 要求存在RedisTemplate类,导入 spring-data-redis 依赖才会激活;
  2. @ConditionalOnMissingBean:容器中没有用户自定义 Bean,才自动创建 业务自己写了 DataSource,则 SpringBoot 不会自动装配默认数据源;
  3. @ConditionalOnProperty:配置文件存在对应配置项才开启;
  4. @ConditionalOnWebApplication:仅 web 环境生效(MVC 自动配置);

举个例子:WebMvcAutoConfiguration 只有项目引入 Servlet、Tomcat 依赖,满足@ConditionalOnClass(DispatcherServlet.class),才会自动装配视图解析器、静态资源映射、转换器等 MVC 组件。

四、自动配置类内部逻辑

每个 XXAutoConfiguration 都是标准@Configuration配置类,内部通过@Bean注册组件:

@Configuration @ConditionalOnClass(RedisTemplate.class) @ConditionalOnMissingBean(RedisTemplate.class) public class RedisAutoConfiguration { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) { // 提供默认RedisTemplate } }

流程:

  1. 引入 redis 依赖 → 存在 RedisTemplate 类;
  2. 业务没手动创建 RedisTemplate Bean;
  3. 自动配置生效,容器自动注入 RedisTemplate,直接 @Autowired 使用。

五、配置文件绑定:@EnableConfigurationProperties

自动配置类配合@EnableConfigurationProperties,把 application.yml/properties 配置映射到属性类:

@EnableConfigurationProperties(RedisProperties.class) public class RedisAutoConfiguration {}

RedisProperties使用@ConfigurationProperties(prefix = "spring.redis"),读取 yml 中 redis 地址、端口、密码,自动注入到 Redis 连接工厂,无需手动读取配置文件。

六、完整闭环流程(串联所有步骤)

  1. 启动类加@SpringBootApplication,开启@EnableAutoConfiguration
  2. @Import(AutoConfigurationImportSelector)执行加载逻辑;
  3. 扫描所有 jar 包META-INF/spring.factories,加载全部自动配置类列表;
  4. 逐个校验配置类上的条件注解,过滤不满足条件的配置;
  5. 剩余生效的自动配置类作为配置类纳入 Spring 容器解析;
  6. 解析配置类中@Bean方法,自动创建组件 Bean;
  7. 通过@ConfigurationProperties读取 yml 配置,给组件注入参数;
  8. 若开发者自定义同名 Bean,@ConditionalOnMissingBean使自动配置失效,实现自定义覆盖默认配置。

七、两大扩展点(面试加分)

  1. 自定义 starter自己写 META-INF/spring.factories,定义自定义 AutoConfiguration,实现业务组件开箱即用,遵循自动配置同一套规范;
  2. 排除指定自动配置启动注解排除不需要的自动类,减少容器加载:
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

八、精简口述总结

SpringBoot 自动配置由 @EnableAutoConfiguration 驱动,通过 AutoConfigurationImportSelector 读取各个 jar 的 spring.factories 文件获取所有自动配置类;依靠 @ConditionalOnClass、@ConditionalOnMissingBean 等条件注解实现按需加载;配置类内部使用 @Bean 提供默认组件,配合 @ConfigurationProperties 读取 yml 配置;用户自定义 Bean 可覆盖默认自动装配,最终实现引入依赖即可开箱即用,无需大量手动配置。

http://www.jsqmd.com/news/1220470/

相关文章:

  • 2026 年 7 月百达翡丽中国官方授权售后网点完整名录|官方搬迁、新店启用统一公示公告 - 百达翡丽中国服务中心
  • Priceline Design System 代码迁移指南:从旧版本升级到最新版本
  • 实测甄选|天津靠谱奢侈品包包回收机构推荐,正规高价更安心 - 讯息早知道
  • GimpPs终极指南:如何3步将GIMP界面秒变Photoshop专业风格
  • SQL 递归查询实战:CTE 递归处理树形组织架构和物料 BOM
  • ECS-Network-Racing-Sample:Unity ECS多人赛车游戏完整入门指南
  • Win11Debloat:让Windows 11回归简洁本质的完整解决方案
  • InAppBillingPlugin 调试与排错:解决常见支付问题的 15 个实用技巧
  • 2026年毕业论文修改工具深度横评:学范文等五大平台实战避坑指南
  • STM32软件模拟I2C驱动AT24C02实战指南
  • 2026国内玻璃水滑道与高空漂流专业服务商综合评测及合规选型指南 - 互联网科技品牌测评
  • Gist插件与GitHub无缝集成:企业版API URL自定义教程
  • 2026昆山奢侈品回收实地横评:从估价到打款,这3家最让人放心 - 生活测评君
  • 每日关注简报|7月19日:AI成本、WSUS与GitHub
  • Protocol Buffers(简称 Protobuf)是 Google 开发的一种**语言中立、平台中立、可扩展的结构化数据序列化格式*
  • 苏州易奢福包包回收|2026香奈儿金球回收价参考,全国连锁30年正规回收优选 - 肉松卷
  • 深度解析vscode-git-graph架构设计:可视化Git仓库管理的技术实现
  • TI C2000 Flash预取与缓存机制:破解CPU与Flash速度瓶颈的实战指南
  • Apple Silicon用户必读:在M系列芯片上高效运行humanizer-1B-OptiQ-4bit的完整指南
  • PyAhoCorasick深度剖析:从理论到实践的多模式字符串匹配革命
  • 2026唐山高价回收名表靠谱商家 素君奢品汇13111597382 高价回收可上门 - GrowUME
  • Agent 内对话质量评分:自动化机评与人工抽样校验
  • 【企业级电话归档刚需】:为什么93%的合规团队仍在用错误的AI语音转文字方案?
  • 官方渠道焕新| 2026 浪琴腕表售后线上核验系统升级,网点一键查询完整操作教程 - 浪琴中国服务中心
  • 阶段六:SSE AI 流式对话
  • 如何在iOS 17设备上解锁JIT编译能力:SideJITServer完全指南
  • GeoPort位置模拟技术实现:iOS开发者测试与虚拟定位架构解析
  • 简历怎么写?HR手把手教你写出通过率100%的求职简历(附实操技巧+靠谱求职平台)
  • Rufus:免费的USB启动盘制作终极指南,轻松安装Windows 11与Linux系统
  • pgagroal扩展开发:如何自定义管道和插件开发指南