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/7/28 3:37:18 阅读更多 →
【搜索结果纯净度提升83%】:基于Query-Document协同置信度的实时过滤框架(附开源评估工具链)

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

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

2026/7/26 19:10: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/7/28 2:24:15 阅读更多 →

最新新闻

TPIC7710 EVM评估模块:电子驻车制动ASIC硬件验证与系统集成指南

TPIC7710 EVM评估模块:电子驻车制动ASIC硬件验证与系统集成指南

1. 项目概述:从芯片到系统,电子驻车制动ASIC的评估之道 在汽车电子开发领域,尤其是涉及底盘和安全的关键系统,工程师面临的最大挑战之一是如何在真实的硬件环境中,安全、高效地验证一颗复杂专用集成电路(AS…

2026/7/28 23:47:15 阅读更多 →
从文档焦虑到自动化自由:5步掌握Dify工作流生成

从文档焦虑到自动化自由:5步掌握Dify工作流生成

从文档焦虑到自动化自由:5步掌握Dify工作流生成 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-Workfl…

2026/7/28 23:47:15 阅读更多 →
5分钟精通Diablo Edit2:暗黑2存档修改器的终极完整指南

5分钟精通Diablo Edit2:暗黑2存档修改器的终极完整指南

5分钟精通Diablo Edit2:暗黑2存档修改器的终极完整指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神2中反复刷装备却一无所获?是否因为技能点分…

2026/7/28 23:47:15 阅读更多 →
Sunshine自托管游戏串流服务器:打造专属家庭云游戏平台的完整指南

Sunshine自托管游戏串流服务器:打造专属家庭云游戏平台的完整指南

Sunshine自托管游戏串流服务器:打造专属家庭云游戏平台的完整指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否厌倦了游戏订阅服务的限制和延迟问题&#xff…

2026/7/28 23:47:15 阅读更多 →
减速机输入端轴径、定位止口和安装孔距怎么确认?二维图纸核对方法详解

减速机输入端轴径、定位止口和安装孔距怎么确认?二维图纸核对方法详解

减速机输入端轴径、定位止口和安装孔距怎么确认?二维图纸核对方法详解 伺服电机与行星减速机的连接,通常涉及两个不同层面的匹配: 性能匹配决定“带不带得动”,机械接口匹配决定“装不装得上”。 很多现场问题并不是减速机扭矩不足…

2026/7/28 23:47:15 阅读更多 →
entii-for-workcubes项目深度解析:从PowerPC架构到任天堂游戏机的适配魔法

entii-for-workcubes项目深度解析:从PowerPC架构到任天堂游戏机的适配魔法

entii-for-workcubes项目深度解析:从PowerPC架构到任天堂游戏机的适配魔法 【免费下载链接】entii-for-workcubes PowerPC Windows NT ported to Nintendo GameCube/Wii/Wii U 项目地址: https://gitcode.com/gh_mirrors/en/entii-for-workcubes entii-for-w…

2026/7/28 23:46:14 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻