SpringBoot10-自动配置原理
一、自动配置在传统 Spring时代你要用数据库得自己写一堆配置DataSource、JdbcTemplate、事务管理器……要用 MVC也得自己配置视图解析器、消息转换器……每个常用组件都要写大量Bean或 XML麻烦又容易出错。Spring Boot 的目标自动帮你把常用组件配好只要你在项目里引入对应的起步依赖starter就几乎可以开箱即用起步依赖中的bean对象会自动注入到IOC容器中。我们现在注入第三方bean的方式不是自动配置。二、自动配置-源码分析2-1、SpringBootApplication你平常写的启动类就是这样标注的SpringBootApplication public class DemoApp { … }它其实是一个组合注解里面包含SpringBootConfiguration相当于ConfigurationComponentScan包扫描EnableAutoConfiguration← 自动配置的关键2-2、EnableAutoConfiguration打开自动配置开关。内部用了Import(AutoConfigurationImportSelector.class)这句的意思交给AutoConfigurationImportSelector来决定要导入哪些配置类。2-3、AutoConfigurationImportSelector它实现了ImportSelector接口里面有一个selectImports()方法String[] selectImports(…)这个方法会去扫描META-INF/spring.factories或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports这些文件在spring-boot-autoconfigure这个 jar 包里。里面列出了大量自动配置类例如org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration …2-4、自动配置类每个自动配置类本质上就是一个普通的Configuration例如AutoConfiguration ConditionalOnClass(DispatcherServlet.class) public class DispatcherServletAutoConfiguration { Bean public DispatcherServlet dispatcherServlet() { return new DispatcherServlet(); } }它们一般都加了各种条件注解 ConditionalConditionalOnClassclasspath 有这个类才加载ConditionalOnMissingBean容器里没同类 Bean 才创建默认的ConditionalOnProperty看配置文件开关2-5、流程串起来应用启动→ 执行SpringBootApplicationEnableAutoConfiguration生效 → 调用AutoConfigurationImportSelector.selectImports()读取spring.factories/.imports文件 → 找到所有自动配置类按条件注解筛选有类、有依赖、没被用户覆盖、配置开关打开…注册满足条件的 Bean如 DispatcherServlet、数据源、MVC 相关组件…2-6、通俗总结Spring Boot 的自动配置就是启动时去jar 包里的配置文件里找所有可能的配置类然后根据条件注解判断要不要加载满足条件的就自动注册 Bean如 Web 容器、数据源、MVC 组件…。你不用手写样板配置Boot 帮你搞定如果不想用或要自定义直接写自己的 Bean 或关掉开关即可。三、自己封装一个Spring Boot Starter的基本套路这张图演示的是把第三方 jarcommon-pojo里的类做成 Spring Boot 自动配置然后在业务项目里“零配置”使用的完整流程。可以按步骤看①CommonConfig—— 普通的配置类Configuration public class CommonConfig { ConditionalOnProperty(prefix country, name {name,system}) Bean public Country country(Value(${country.name}) String name, Value(${country.system}) String system) { return new Country(name, system); } Bean public Province province() { return new Province(); } }作用把Country、Province这两个第三方类注册成 Spring Bean。ConditionalOnProperty只有当配置文件里有country.name和country.system时才创建Country。Bean返回实例交给 IoC 容器管理。如果只是单独项目使用可以直接Import(CommonConfig.class)但如果想封装成starter还需要后面的步骤。②CommonAutoConfig—— 自动配置类AutoConfiguration Import(CommonConfig.class) public class CommonAutoConfig {}用AutoConfiguration或老版本的Configuration 条件注解声明这是一个自动配置类。Import(CommonConfig.class)把真正声明 Bean 的CommonConfig引入。关键点用户项目不用自己Import(CommonConfig.class)而是通过自动配置机制自动加载。③/④ 注册到spring.factories或.imports在common-pojo-1.0-SNAPSHOT.jar的resources/META-INF/spring/下老版本Spring Boot 2.xspring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration\ cn.itcast.config.CommonAutoConfig新版本3.x 推荐org.springframework.boot.autoconfigure.AutoConfiguration.imports cn.itcast.config.CommonAutoConfig作用告诉 Spring Boot“当有人引入我的 jar 时把CommonAutoConfig作为自动配置类。”业务项目右边SpringBootApplication public class SpringbootRegistApplication { }用户项目什么都不用写只要引入了common-pojo这个依赖并在application.yml配好country.name、country.system。Spring Boot 启动时会扫描到 jar 包里的AutoConfiguration.imports。把CommonAutoConfig加入。CommonAutoConfig又Import了CommonConfig。满足条件注解后自动创建Country、ProvinceBean。 总结流程写一个配置类CommonConfig里面Bean注册需要的对象配合条件注解。写一个自动配置入口CommonAutoConfigAutoConfigurationImport(CommonConfig)。在 jar 包的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports写入CommonAutoConfig的全类名。用户只要引入这个 jar 在配置文件里写参数Spring Boot 会自动帮他装配好 Bean无需在业务代码手动Import或Bean。这就是自己封装一个Spring Boot Starter的基本套路。①②写配置类③④注册到spring.factories/.imports业务项目直接用SpringBootApplication即“开箱即用”。项目简单只有一个配置类 ↓ 直接 AutoConfiguration imports 文件 ↓ 不需要 Import不需要第二层包装 项目复杂配置要拆成多个类 ↓ 写一个 AutoConfiguration 主入口 ↓ 主入口用 Import 导入多个 Configuration 子配置 ↓ imports 文件里只写主入口约定俗成的分工是AutoConfiguration→ 只给真正的自动配置入口用必须出现在imports文件里Configuration→给被Import导入的辅助配置类用示例拆分成多个类复杂场景当你的 starter 要配置的东西很多数据源、缓存、Web、安全……全写在一个类里会很长。这时候需要拆分。但imports文件里如果写一堆类会变得很乱// 这样写太散了不好维护 com.example.CommonDataSourceConfig com.example.CommonCacheConfig com.example.CommonWebConfig com.example.CommonSecurityConfig所以常见的做法是Step 1写一个主入口类只负责组装AutoConfiguration AutoConfigureAfter(DataSourceAutoConfiguration.class) Import({CommonDataSourceConfig.class, CommonCacheConfig.class, CommonWebConfig.class}) public class CommonAutoConfiguration { // 这个类可以什么都不做就是个总开关 }Step 2把具体配置拆成普通Configuration类Configuration(proxyBeanMethods false) public class CommonDataSourceConfig { Bean public DataSource commonDataSource() { ... } } Configuration(proxyBeanMethods false) public class CommonCacheConfig { Bean public CacheManager commonCacheManager() { ... } }Step 3imports文件里只写主入口com.example.autoconfigure.CommonAutoConfiguration四、小结五、自定义starter示例步骤一快速创建两个mavne工程步骤二配置dmybatis-spring-boot-atutoconfigure工程的pom.xml文件添加依赖。仿照以上的依赖进行添加。步骤三编写自动配置类// 标识当前类是一个自动配置类 AutoConfiguration public class MybatisAutoConfig { // 注入SqlSessionFactoryBean Bean public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){ SqlSessionFactoryBean sqlSessionFactoryBean new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); return sqlSessionFactoryBean; } // 注入MapperScannerConfigure Bean public MapperScannerConfigurer mapperScannerConfigurer(BeanFactory beanFactory){ MapperScannerConfigurer mapperScannerConfigurer new MapperScannerConfigurer(); // 扫描的包启动类所在的包及其子包 ListString packages AutoConfigurationPackages.get(beanFactory); String p packages.get(0); mapperScannerConfigurer.setBasePackage(p); // 扫描的注解 mapperScannerConfigurer.setAnnotationClass(Mapper.class); return mapperScannerConfigurer; } }步骤四声明自动配置类的全类名目的让这个自定义的自动配置类被springboot读取到。4-1、创建.import配置文件配置文件名可以直接从添加的依赖中获取在dmybatis-spring-boot-atutoconfigure工程中创建相同路径的文件。4-2、在配置文件中添加自动配置类的全类名步骤五dmybatis-spring-boot-starter模块添加依赖管理!-- 引入自动配置模块对应的依赖 -- dependency groupIdorg.example/groupId artifactIddmybatis-spring-boot-autoconfigure/artifactId version1.0-SNAPSHOT/version /dependency !-- 将自动配置模块中的所有依赖也引入 -- !-- 目的方便以后排除添加新的版本的依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId version3.1.2/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jdbc/artifactId version3.1.2/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.5.19/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version3.0.4/version /dependency步骤六删除多余的pakages步骤七将项目中的mybatis-spring-boot-starter替换为自定义的starter其余代码均不变

相关新闻

Pyro4完全指南:如何使用Python远程对象实现分布式系统开发

Pyro4完全指南:如何使用Python远程对象实现分布式系统开发

Pyro4完全指南:如何使用Python远程对象实现分布式系统开发 【免费下载链接】Pyro4 Pyro 4.x - Python remote objects 项目地址: https://gitcode.com/gh_mirrors/py/Pyro4 Pyro4是Python开发者的终极分布式系统解决方案!这个强大的Python远程对象…

2026/10/20 12:29:53 阅读更多 →
【搜索结果纯净度提升83%】:基于Query-Document协同置信度的实时过滤框架(附开源评估工具链)

【搜索结果纯净度提升83%】:基于Query-Document协同置信度的实时过滤框架(附开源评估工具链)

更多请点击: https://intelliparadigm.com 第一章:【搜索结果纯净度提升83%】:基于Query-Document协同置信度的实时过滤框架(附开源评估工具链) 传统搜索结果后处理常依赖静态阈值或孤立文档打分,难以应对…

2026/10/18 11:08:14 阅读更多 →
Ruby统计计算库深度解析:Statsample与Distribution应用指南

Ruby统计计算库深度解析:Statsample与Distribution应用指南

Ruby统计计算库深度解析:Statsample与Distribution应用指南 【免费下载链接】data-science-with-ruby Practical Data Science with Ruby based tools. 项目地址: https://gitcode.com/gh_mirrors/da/data-science-with-ruby 在数据分析与统计计算领域&#…

2026/10/18 5:11:06 阅读更多 →

最新新闻

MVMD联合小波阈值去噪:多通道非平稳信号MATLAB实战

MVMD联合小波阈值去噪:多通道非平稳信号MATLAB实战

简介:这份资源面向信号处理、故障诊断与振动监测方向的学习者和研究人员,提供一套基于MATLAB的完整联合去噪方案,用于从含噪多通道信号中恢复原始信号。核心流程涵盖MVMD多元变分模态分解、基于相关系数的有效模态筛选、小波阈值去噪、模态重…

2026/10/20 17:03:25 阅读更多 →
Jenkinsfile编写五大致命难点与生产级避坑指南

Jenkinsfile编写五大致命难点与生产级避坑指南

1. 项目概述:Jenkinsfile不是“写脚本”,而是定义持续交付流水线的契约你有没有在某个周五下午三点,刚把 Jenkinsfile 提交到 Git 仓库,CI 流水线就突然卡在“Checkout”阶段,日志里只有一行红色报错:hudso…

2026/10/20 17:03:25 阅读更多 →
NFS安全加固:封堵showmount -e信息泄露漏洞CVE-1999-0554

NFS安全加固:封堵showmount -e信息泄露漏洞CVE-1999-0554

在给一批NFS服务器做安全体检时,我用 showmount -e 扫了一遍内网,结果让我后背发凉——几乎一半的机器把完整导出列表敞开给了任何能摸到端口的人。这不是个新问题,它的编号叫 CVE-1999-0554,二十多年前就被登记在案&#xff0c…

2026/10/20 17:03:25 阅读更多 →
ShardingSphere未分片表SQL检测跳过机制解析

ShardingSphere未分片表SQL检测跳过机制解析

1. 项目概述:为什么“未分片表跳过SQL检测”不是Bug,而是关键设计取舍Apache ShardingSphere作为国内主流的数据库中间件,这几年在金融、电商、政务类系统中落地非常扎实。我接触过的几十个真实项目里,有超过七成在上线前都卡在一…

2026/10/20 17:03:25 阅读更多 →
SonarQube安装部署全指南:从环境准备到代码质量平台落地

SonarQube安装部署全指南:从环境准备到代码质量平台落地

最近帮一个团队把代码静态检查环境搭起来,我在测试服务器上完整走了一遍sonar安装的流程。以前看别人部署SonarQube觉得就是下载、解压、启动三连,真到自己上手才发现,这玩意儿对环境的要求比想象中多:数据库版本要匹配、内置搜索…

2026/10/20 17:03:25 阅读更多 →
AI驱动的自动化渗透测试原理与金融行业防御实战

AI驱动的自动化渗透测试原理与金融行业防御实战

1. 项目概述:当金融业遭遇AI驱动的渗透测试新范式最近几周,多家韩国金融机构的公开通报和内部安全简报在技术圈悄然流传——不是传统意义上的“勒索软件爆发”或“钓鱼邮件泛滥”,而是更令人警觉的模式:攻击者未依赖社会工程&…

2026/10/20 17:02:23 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/20 9:50:45 阅读更多 →