【Spring框架学习(七)】:Spring Boot自动配置原理 Spring框架学习系列《Spring框架学习一从设计思想到核心架构全面认识Spring》《Spring框架学习二IOC核心原理解析为什么Autowired可以自动注入》《Spring框架学习三Spring Bean生命周期详解》《Spring框架学习四Spring AOP动态代理实现原理》《Spring框架学习五Spring MVC请求处理流程解析》《Spring框架学习六Spring事务实现原理》《Spring框架学习七Spring Boot自动配置原理》《Spring框架学习八Spring源码整体流程总结》一、前言在前面的文章中我们学习了 Spring Framework 的核心能力IOC控制反转Bean生命周期对象创建流程AOP动态代理机制Spring MVC请求处理流程Spring事务声明式事务实现但是在实际企业开发中我们很少直接使用 Spring Framework。现在主流开发方式spring-boot-starter-web搭配SpringBootApplication一个简单的启动类SpringBootApplication public class Application { public static void main(String[] args){ SpringApplication.run( Application.class,args ); } }项目就可以直接运行。那么问题来了为什么引入一个依赖就能使用对应功能为什么不需要大量XML配置Spring Boot如何自动创建BeanSpringBootApplication到底做了什么这些问题的答案就是 Spring Boot 自动配置机制。二、为什么需要Spring Boot在 Spring Framework 时代创建一个项目通常需要大量配置。例如配置Spring容器bean iduserService classcom.demo.UserService/配置数据库bean iddataSource /bean配置MVCmvc:annotation-driven/问题配置复杂学习成本高项目搭建慢Spring Boot的目标快速创建生产级Spring应用。它主要解决1. 配置复杂问题通过自动配置。2. 依赖管理问题通过Starter。3. 项目部署问题通过内嵌服务器。例如Tomcat直接集成。三、Spring Boot核心特点Spring Boot主要有三个核心能力1. 自动配置根据项目环境自动创建Bean。例如引入spring-boot-starter-webSpring Boot自动创建Spring MVC环境配置DispatcherServlet配置Jackson启动Tomcat2. Starter机制解决依赖管理。例如以前使用Web功能需要几十个依赖。现在只需要dependency artifactId spring-boot-starter-web /artifactId /dependency3. 内嵌服务器传统安装Tomcat。Spring Boot直接启动。例如SpringApplication.run();启动Spring Boot Tomcat ↓ Web服务启动四、SpringBoot启动流程启动代码SpringApplication.run( Application.class,args );执行流程创建SpringApplication对象 ↓ 准备Environment ↓ 创建ApplicationContext ↓ 加载自动配置 ↓ 扫描Bean ↓ 刷新容器 ↓ 启动完成其中最核心就是自动配置加载。五、SpringBootApplication解析我们开发中只需要一个注解SpringBootApplication实际上它是三个注解组合SpringBootConfiguration EnableAutoConfiguration ComponentScan六、ComponentScan组件扫描作用扫描项目中的Bean。例如Service public class UserService{ }Spring启动时扫描com.demo ↓ UserService ↓ 注册Bean这个能力来自Spring IOC。七、SpringBootConfiguration本质就是Configuration表示这是一个配置类。例如Configuration public class AppConfig{ }Spring会读取里面的Bean定义。八、EnableAutoConfiguration核心原理三个注解中最重要的是EnableAutoConfiguration它开启自动配置。它内部包含Import( AutoConfigurationImportSelector.class )重点AutoConfigurationImportSelector它负责加载自动配置类。九、自动配置到底是什么简单理解Spring Boot提前写好了很多配置类。例如Web自动配置WebMvcAutoConfiguration数据库DataSourceAutoConfiguration事务TransactionAutoConfiguration这些配置类会根据项目环境决定是否加载。十、自动配置加载流程完整流程启动Spring Boot ↓ EnableAutoConfiguration ↓ AutoConfigurationImportSelector ↓ 读取配置文件 ↓ 加载自动配置类 ↓ 条件判断 ↓ 创建Bean十一、META-INF配置文件Spring Boot如何知道有哪些自动配置关键文件META-INF/spring.factories里面保存自动配置类。例如org.springframework.boot.autoconfigure.EnableAutoConfiguration \ DataSourceAutoConfiguration, \ WebMvcAutoConfigurationSpring启动时读取这个文件,然后加载对应配置。十二、Spring Boot 3之后的变化Spring Boot 2时代主要spring.factoriesSpring Boot 3开始改为META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports例如DataSourceAutoConfiguration WebMvcAutoConfiguration作用相同告诉Spring有哪些自动配置。十三、条件装配机制Spring Boot并不是无条件创建Bean。它会判断环境。例如Configuration ConditionalOnClass(DataSource.class) public class DataSourceAutoConfiguration{ }意思如果classpath存在DataSource才加载配置。常见条件注解ConditionalOnClass判断是否存在某个类。例如存在MyBatis才配置MyBatis。ConditionalOnBean判断是否已有某个Bean。ConditionalOnMissingBean如果不存在才创建默认Bean。例如Bean ConditionalOnMissingBean public UserService userService(){ return new UserService(); }如果用户自己定义不会覆盖。十四、Starter原理为什么引入一个starter,功能就出现例如spring-boot-starter-web它主要包含1. 依赖管理例如包含spring-web spring-webmvc jackson tomcat2. 自动配置引入依赖后classpath出现对应类。例如Tomcat存在。满足条件ConditionalOnClass自动配置生效。流程引入starter ↓ 依赖进入classpath ↓ 触发条件判断 ↓ 加载AutoConfiguration ↓ 创建Bean十五、Spring Boot如何启动Tomcat引入spring-boot-starter-web自动配置ServletWebServerFactoryAutoConfiguration创建TomcatServletWebServerFactory启动Spring Boot ↓ 创建Tomcat ↓ 注册DispatcherServlet ↓ Web服务启动十六、自定义Spring Boot Starter企业开发中也可以创建自己的Starter。例如公司统一日志组件。结构my-log-spring-boot-starter | |- 自动配置类 | |- AutoConfiguration.imports | |- 业务Bean使用dependency my-log-spring-boot-starter /dependency即可自动生效。十七、Spring Boot核心源码类重点关注作用核心类启动入口SpringApplication自动配置入口EnableAutoConfiguration配置加载AutoConfigurationImportSelector自动配置基类AutoConfiguration条件判断Condition容器刷新AbstractApplicationContext十八、Spring Boot自动配置完整流程整体流程启动项目 ↓ SpringBootApplication ↓ ComponentScan扫描Bean ↓ EnableAutoConfiguration ↓ 读取AutoConfiguration配置 ↓ 加载自动配置类 ↓ Condition条件判断 ↓ 创建Bean ↓ 应用启动完成十九、总结Spring Boot最大的价值就是在Spring基础上通过自动配置降低开发复杂度。它的核心机制Starter提供依赖 ↓ EnableAutoConfiguration开启自动配置 ↓ 读取AutoConfiguration ↓ 条件判断 ↓ 自动创建Bean理解 Spring Boot 自动配置之后就能真正理解为什么引入starter就能使用功能为什么Spring Boot不需要大量XML配置为什么一个SpringBootApplication就能启动项目为什么企业可以快速搭建后端服务下一篇文章《Spring框架学习八Spring源码整体流程总结》将对整个 Spring Framework 学习系列进行总结把 IOC、Bean、AOP、MVC、事务、Boot 自动配置串联起来形成完整的 Spring 源码知识体系。