首页/新闻资讯/正文详情

SpringBoot_02_自动配置原理

发布时间:2026/9/27 1:34:14 来源:云帆数科 栏目:资讯中心
SpringBoot_02_自动配置原理
【Spring Boot】自动配置原理EnableAutoConfiguration 与 Starter 机制关键词Java、Spring Boot、自动配置、EnableAutoConfiguration、Conditional、Starter、SPI一、什么是自动配置Spring Boot 自动配置是指根据你引入的依赖自动帮你配置好对应的 Bean不需要手动写 XML 或 Bean。一句话理解你在 pom.xml 引入了spring-boot-starter-webSpring Boot 就自动帮你配好 DispatcherServlet、视图解析器、JSON 转换器等开箱即用。二、自动配置的核心流程SpringBootApplication ↓ EnableAutoConfiguration ↓ Import(AutoConfigurationImportSelector.class) ↓ 读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports ↓ 加载所有自动配置类xxxAutoConfiguration ↓ 根据 Conditional 条件判断是否生效 ↓ 注册对应的 Bean 到 Spring 容器三、关键注解详解3.1 EnableAutoConfigurationTarget(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)Import(AutoConfigurationImportSelector.class)publicinterfaceEnableAutoConfiguration{}核心是通过Import导入AutoConfigurationImportSelector它负责加载所有自动配置类。3.2 AutoConfigurationImportSelector// 简化版逻辑publicclassAutoConfigurationImportSelectorimplementsImportSelector{OverridepublicString[]selectImports(AnnotationMetadatametadata){// 读取 META-INF/spring/...AutoConfiguration.imports 文件// 返回所有自动配置类的全限定类名returngetCandidateConfigurations(annotationMetadata);}}配置文件位置Spring Boot 3.xMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsSpring Boot 2.xMETA-INF/spring.factories3.3 Conditional 系列注解Conditional 是自动配置生效的关键——只有满足条件时配置类才会生效。注解条件ConditionalOnClassclasspath 中存在某个类时生效ConditionalOnMissingClassclasspath 中不存在某个类时生效ConditionalOnBean容器中存在某个 Bean 时生效ConditionalOnMissingBean容器中不存在某个 Bean 时生效ConditionalOnProperty配置属性满足某个值时生效ConditionalOnWebApplication当前是 Web 应用时生效四、源码解读Web 自动配置4.1 ServletWebServerFactoryAutoConfigurationAutoConfigurationConditionalOnWebApplication(typeType.SERVLET)ConditionalOnClass(DispatcherServlet.class)publicclassServletWebServerFactoryAutoConfiguration{BeanConditionalOnMissingBeanpublicServletWebServerFactorywebServerFactory(Value(${server.port:8080})intport){// 创建内嵌 TomcatTomcatServletWebServerFactoryfactorynewTomcatServletWebServerFactory();factory.setPort(port);returnfactory;}BeanConditionalOnMissingBeanpublicDispatcherServletdispatcherServlet(){returnnewDispatcherServlet();}}解读ConditionalOnWebApplication(type SERVLET)只有 Servlet 类型 Web 应用才生效ConditionalOnClass(DispatcherServlet.class)classpath 有 DispatcherServlet 才生效ConditionalOnMissingBean如果用户没有自定义才使用默认配置这就是约定优于配置的实现有 web 依赖 → 自动配 Tomcat DispatcherServlet你自定义了 → 用你的不用默认的4.2 DataSourceAutoConfiguration数据源自动配置AutoConfigurationConditionalOnClass(DataSource.class)EnableConfigurationProperties(DataSourceProperties.class)publicclassDataSourceAutoConfiguration{BeanConditionalOnMissingBeanConditionalOnProperty(spring.datasource.url)publicDataSourcedataSource(DataSourcePropertiesproperties){returnproperties.initializeDataSourceBuilder().build();}}解读ConditionalOnClass(DataSource.class)引入了数据库驱动才生效ConditionalOnProperty(spring.datasource.url)配置了 URL 才生效ConditionalOnMissingBean用户没自定义 DataSource 才创建默认的五、Starter 机制5.1 什么是 StarterStarter 是一组依赖集合引入一个 Starter 就等于引入了一组相关依赖且版本经过验证不会冲突。!-- 引入这个 Starter自动包含 --!-- spring-web, spring-webmvc, jackson, tomcat, ... --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency5.2 常用 StarterStarter功能spring-boot-starter-webWeb 开发MVC Tomcat Jacksonspring-boot-starter-data-jpaJPA 数据访问spring-boot-starter-data-redisRedis 操作spring-boot-starter-security安全认证spring-boot-starter-test测试JUnit Mockitospring-boot-starter-actuator监控和管理mybatis-spring-boot-starterMyBatis 整合5.3 Starter 的组成一个 Starter 通常包含pom.xml聚合依赖自动配置类xxxAutoConfiguration配置属性类xxxPropertiesAutoConfiguration.imports或spring.factories注册自动配置类六、自定义 Starter三步走① 配置属性类ConfigurationProperties(prefixmy.log)publicclassLogProperties{privatebooleanenabledtrue;privateStringprefix[LOG];// getter/setter}② 自动配置类AutoConfigurationConditionalOnWebApplicationEnableConfigurationProperties(LogProperties.class)publicclassLogAutoConfiguration{BeanConditionalOnMissingBeanpublicLogInterceptorlogInterceptor(LogPropertiesprops){returnnewLogInterceptor(props);}BeanpublicWebMvcConfigurerlogWebMvcConfigurer(LogInterceptorinterceptor){returnnewWebMvcConfigurer(){OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(interceptor).addPathPatterns(/**);}};}}③ 注册在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中写入com.example.LogAutoConfiguration。其他项目引入该 Starter 依赖后配置my.log.enabledtrue即可自动生效。七、如何查看哪些自动配置生效了7.1 启动日志启动时设置debugtruedebug:true或命令行java -jar app.jar --debug控制台会输出CONDITIONS EVALUATION REPORTPositive matches生效的自动配置Negative matches未生效的自动配置及原因7.2 IDEA 查看安装 Spring Boot Assistant 插件可以在 yml 中直接看到配置对应的自动配置类。八、面试高频问题Q1Spring Boot 自动配置的原理答SpringBootApplication包含EnableAutoConfiguration它通过Import(AutoConfigurationImportSelector.class)加载AutoConfiguration.imports中的所有自动配置类。每个配置类上都有Conditional系列注解只有满足条件如 classpath 存在某个类、容器中存在某个 Bean、配置属性满足某个值时配置类才会生效并注册对应的 Bean。Q2ConditionalOnBean 和 ConditionalOnMissingBean 的区别答ConditionalOnBean表示容器中存在某个 Bean 时才生效ConditionalOnMissingBean表示容器中不存在某个 Bean 时才生效。后者常用于提供默认配置——如果用户没有自定义就使用框架提供的默认 Bean。Q3如何自定义 Starter答三步① 创建xxxProperties配置属性类用ConfigurationProperties绑定配置项② 创建xxxAutoConfiguration自动配置类用Conditional控制生效条件③ 在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中注册配置类的全限定名。九、总结知识点核心要点自动配置原理EnableAutoConfiguration→ 加载 imports →Conditional条件判断Conditional控制配置类是否生效的核心注解Starter一组依赖集合 自动配置开箱即用自定义 StarterProperties AutoConfiguration imports 文件下一篇预告《Spring Boot Web 开发》详解 RESTful API、全局异常处理、拦截器在 Spring Boot 中的实现。

相关推荐

基于RAG的电商竞品分析系统设计计算机毕业设计(源码+lw+部署文档+讲解等)
基于RAG的电商竞品分析系统设计计算机毕业设计(源码+lw+部署文档+讲解等)

博主介绍:✌ 专注于VUE,小程序,安卓,Java,python,物联网专业,有18年开发经验,长年从事毕业指导,项目实战✌选取一个适合的毕业设计题目很重要。✌关注✌私信我✌具体的问题,我会尽力帮助你。一、… · 2026/9/27 1:34:08

Python+Unet实现遥感图像道路提取:从数据到后处理全流程
Python+Unet实现遥感图像道路提取:从数据到后处理全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:34:08

RISC-V链接脚本link.ld与Zicsr中断实战解析
RISC-V链接脚本link.ld与Zicsr中断实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:34:08

南通做百度网站的公司哪家好?3个坑点教你避开性能优化雷区
南通做百度网站的公司哪家好?3个坑点教你避开性能优化雷区

南通做百度网站的公司哪家好?3个坑点教你避开性能优化雷区 域名服务器搞不懂,是很多南通老板找建站公司时的第一道坎。你以为买个.com域名、租台云服务器就能开工,结果上线后打开速度慢如蜗牛,百度收录更是石沉大海。这背后不仅是配置问题,更是… · 2026/9/27 2:14:53

2026最新网站优化方案ppt:3步搞定拖期痛点
2026最新网站优化方案ppt:3步搞定拖期痛点

2026最新网站优化方案ppt:3步搞定拖期痛点 改个需求建站公司拖一周,这种憋屈感谁懂?别等了,2026最新的网站优化方案ppt里藏着真干货。今天就把这套实操逻辑拆透,让你不再被外包牵着鼻子走。 一、SEO原理速懂:别被黑话忽悠… · 2026/9/27 2:14:34

凡科与wordpress源码对比避坑指南 3类预算省钱方案
凡科与wordpress源码对比避坑指南 3类预算省钱方案

凡科与wordpress源码对比避坑指南 3类预算省钱方案 网站做好了没人访问,这行话太扎心。很多老板花大几万做站,上线三个月,后台日均IP还是个位数,钱白花不说,还耽误了获客黄金期。我干了十年建站,见过太多这种“哑巴站”。今天这篇… · 2026/9/27 2:14:28

浙江站长避坑指南:一文搞懂装饰设计网站模板
浙江站长避坑指南:一文搞懂装饰设计网站模板

浙江站长避坑指南:一文搞懂装饰设计网站模板 找建站公司怕被坑高价,这是很多刚入行做装饰设计站长的噩梦。你拿着几万块的预算去谈,对方张口就是“高端定制”,最后发现就是个套皮模板,改个颜色还要加钱。别急,今天咱们不整虚的,直接拆解… · 2026/9/27 2:14:04

3个技巧搞定wordpress笑话站主题,新手选哪家好
3个技巧搞定wordpress笑话站主题,新手选哪家好

3个技巧搞定wordpress笑话站主题,新手选哪家好 不会写代码想做个站?别慌,这行老手教你选对wordpress笑话站主题。很多人卡在“哪家好”这一步,其实核心是看模板是否适配你的内容结构。下面直接上干货,按项目流程拆给你看。… · 2026/9/27 2:13:52

VSCode+ESP8266 RTOS_SDK环境搭建:编译烧录全攻略
VSCode+ESP8266 RTOS_SDK环境搭建:编译烧录全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 2:13:52

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码