Spring框架学习系列《Spring框架学习一从设计思想到核心架构全面认识Spring》《Spring框架学习二IOC核心原理解析为什么Autowired可以自动注入》《Spring框架学习三Spring Bean生命周期详解》《Spring框架学习四Spring AOP动态代理实现原理》《Spring框架学习五Spring MVC请求处理流程解析》《Spring框架学习六Spring事务实现原理》《Spring框架学习七Spring Boot自动配置原理》《Spring框架学习八Spring源码整体流程总结》一、前言经过前面七篇文章的学习我们已经分别了解了 Spring 框架中的核心模块Spring整体架构IOC控制反转Bean生命周期AOP动态代理Spring MVC请求流程Spring事务实现原理Spring Boot自动配置但是这些知识点如果单独来看会比较零散。例如IOC为什么可以管理对象AOP为什么需要代理事务为什么依赖AOPSpring Boot为什么可以自动创建Bean这些问题实际上都围绕一个核心Spring容器启动之后到底发生了什么因此本文作为 Spring 学习系列最后一篇将整个 Spring 源码流程串联起来。二、Spring核心流程整体认识Spring本质上就是一个对象管理框架。它围绕三个核心问题展开1. 对象从哪里来对应IOC2. 对象如何增强对应AOP3. 对象如何参与业务对应MVC、事务等扩展功能。整体结构Spring容器启动 ↓ Bean定义加载 ↓ Bean对象创建 ↓ 依赖注入 ↓ 生命周期管理 ↓ AOP增强 ↓ 业务调用三、Spring启动流程我们从最熟悉的代码开始。Spring Boot项目启动SpringBootApplication public class Application { public static void main(String[] args){ SpringApplication.run( Application.class,args ); } }最终会进入SpringApplication.run()四、SpringApplication创建首先创建SpringApplication对象。核心代码new SpringApplication(primarySources)这个阶段主要做判断应用类型加载初始化器加载监听器保存启动参数例如判断当前项目是Web应用还是普通Java应用五、创建ApplicationContextSpring需要一个容器。Spring Boot会创建ApplicationContextWeb项目默认AnnotationConfigServletWebServerApplicationContext它负责管理Bean加载配置刷新容器六、refresh()Spring启动核心Spring真正启动的核心就是refresh()源码位置AbstractApplicationContext这个方法非常重要。Spring几乎所有核心流程都在这里完成。七、prepareBeanFactory准备Bean工厂首先创建BeanFactory。核心DefaultListableBeanFactory它负责保存Bean定义。例如userService ↓ BeanDefinition ↓ UserService.class八、扫描BeanSpring开始扫描项目。例如Service public class UserService{ }扫描com.example ↓ UserService ↓ 注册BeanDefinition核心ClassPathBeanDefinitionScanner九、BeanDefinition注册Spring不会马上创建对象,而是先保存Bean定义信息。例如Bean名称: userService 类型: UserService 作用域: singleton保存位置DefaultListableBeanFactory内部MapString,BeanDefinition十、实例化Bean容器启动后开始创建单例Bean。入口finishBeanFactoryInitialization()调用preInstantiateSingletons()开始创建。十一、Bean创建完整流程核心方法createBean()流程BeanDefinition ↓ 实例化对象 ↓ 属性注入 ↓ Aware回调 ↓ BeanPostProcessor前置 ↓ 初始化方法 ↓ BeanPostProcessor后置 ↓ 放入单例池十二、IOC核心流程总结把IOC串起来启动Spring ↓ 扫描Component ↓ 生成BeanDefinition ↓ 注册BeanDefinition ↓ 创建Bean ↓ 依赖注入 ↓ 保存Bean ↓ 业务使用IOC解决的问题Spring如何管理对象。十三、AOP什么时候介入很多人会疑惑Bean创建完成之后AOP在哪里发生答案BeanPostProcessor。具体AbstractAutoProxyCreator它属于Bean后置处理器。流程创建Bean ↓ 初始化完成 ↓ 判断是否需要代理 ↓ 创建代理对象 ↓ 返回代理Bean例如原对象UserService增强后UserServiceProxy十四、为什么事务可以生效因为Transactional最终也是AOP。流程Transactional ↓ 创建代理对象 ↓ TransactionInterceptor ↓ 开启事务 ↓ 执行方法 ↓ 提交/回滚所以事务不是数据库能力,而是Spring通过代理实现的增强能力。十五、Spring MVC如何加入整个体系请求进入浏览器 ↓ DispatcherServlet ↓ Controller ↓ Service ↓ DAO其中Controller、Service、DAO本质都是Spring Bean。所以MVC建立在IOC基础之上。十六、Spring Boot自动配置如何加入Spring Boot启动时通过EnableAutoConfiguration加载自动配置类。例如数据库DataSourceAutoConfigurationMVCWebMvcAutoConfiguration事务TransactionAutoConfiguration然后这些配置继续创建Bean,最终还是回到IOC容器。十七、Spring完整架构关系整个Spring体系可以这样理解Spring Boot | 自动配置机制 | Spring Framework | ------------------------------------------------ IOC AOP MVC Transaction | Bean容器 | Java对象管理十八、Spring源码学习路线总结如果继续深入源码推荐顺序第一阶段IOC源码重点ApplicationContext BeanFactory BeanDefinition createBean()理解对象如何创建。第二阶段Bean生命周期重点BeanPostProcessor Aware 初始化 销毁理解对象如何被管理。第三阶段AOP源码重点ProxyFactory JdkDynamicAopProxy CglibAopProxy理解对象如何增强。第四阶段Spring MVC源码重点DispatcherServlet HandlerMapping HandlerAdapter理解请求如何处理。第五阶段Spring Boot源码重点SpringApplication AutoConfigurationImportSelector理解自动配置。十九、Spring源码学习建议学习Spring源码不要一开始就直接阅读几万行源码。更推荐带着问题学习。例如为什么Autowired可以注入寻找AutowiredAnnotationBeanPostProcessor为什么事务可以回滚寻找TransactionInterceptor为什么请求可以找到Controller寻找HandlerMapping这样学习效率更高。二十、总结Spring框架虽然功能很多,但是核心思想非常清晰。最终可以归纳为IOC 负责对象管理 AOP 负责功能增强 MVC 负责请求处理 Transaction 负责事务控制 Boot 负责自动配置Spring真正强大的地方不是提供了多少注解。而是通过容器、代理、扩展机制让复杂系统变得更加容易维护。经过这八篇文章学习已经建立了 Spring 框架的整体知识体系。后续深入方向可以继续学习Spring IOC源码深度解析Spring Bean三级缓存Spring循环依赖原理Spring AOP源码分析Spring Boot自动配置源码Spring Cloud微服务体系