从SpringBoot启动,阅读源码设计

目录

  • 一、背景说明
  • 二、SpringBoot工程
  • 三、应用上下文
  • 四、资源加载
  • 五、应用环境
  • 六、Bean对象
  • 七、Tomcat服务
  • 八、事件模型
  • 九、配置加载
  • 十、数据库集成
  • 十一、参考源码
服务启动堪称Spring源码设计的答案;
一、背景说明初学SpringBoot框架时 , 第一次启动服务 , 直呼什么鬼?只需要简单的几步配置 , 几个核心的注解,就可以快速实现工程的搭建和运行;
虽然从Spring框架迁移到SpringBoot框架 , 在初期会有很多的不适应,但是更好用的框架会快速得到认可,从而成为主流的技术选型;
对于大多数的框架或者组件来说,如果使用起来越是简便,那么其内部的封装策略就越是复杂;
比如在Spring框架更新到SpringBoot版本时,其用法的简便与内部封装的复杂性已经形成强烈的对比;再到SpringCloud微服务框架时 , 其封装逻辑复杂到离谱;
对于服务端的开发来说 , 绕不开对Spring框架的深度学习,如果单纯站在源码阅读的角度,建议先熟读SpringBoot启动流程,然后再适当扩展其他源码块;
二、SpringBoot工程首先聊一聊阅读源码的基本思路,从一个极简的案例开始,围绕案例中的核心API作为切入点,通过对源码逻辑的断点调试 , 从而体会其设计的原理;
阅读SpringBoot的源码,可以从服务启动方法作为切入点,然后不断的分析启动过程涉及到的核心API和设计原理,再基于具体的启动日志去分析抽象的加载逻辑;
从SpringBoot启动,阅读源码设计

文章插图
在看具体的源码之前,还需要说下分析思路,Spring项目中,要注意每个API所属工程与层级,然后再去分析API之间关系,核心的构造、属性、方法等;
在SpringBoot的启动类中,有两个核心的切入点,一个是类的构造方法,完成一列的初始化动作;一个是启动方法,实现应用上下文的创建和装载;
构造方法:
从SpringBoot启动,阅读源码设计

文章插图
启动方法:
从SpringBoot启动,阅读源码设计

文章插图
需要说明的是,由于SpringBoot服务启动过程涉及源码过多,所以上面的源码中只是罗列部分的核心切入点,然后围绕这些关键流程展开,分析一些常见的源码设计;
另外说明一点 , 以下源码的核心版本:JDK-1.8spring-5.2.4spring-boot-2.2.5 , 在不同的版本下源码会存在差异;
三、应用上下文服务启动时,根据应用类型判断创建的上下文,此处启动的是基于servlet的web应用,所以也依赖相应的web服务器,默认为Tomcat;
启动方法的核心在于对应用上下文的创建、准备、刷新 , 应用上下文是一个十分抽象的描述,可以理解为应用运行的整体环境,其中涉及到资源加载,配置文件装配,运行服务的管理等,后续的源码分析都围绕该API展开;
从SpringBoot启动,阅读源码设计

文章插图
ApplicationContext:应用上下文核心接口,在该接口中所有的方法都是只读模式,即只能通过Get方法进行访问;
ConfigurableApplicationContext:上下文配置扩展接口,提供了应用上下文的配置能力,生命周期的维护,以及在关闭之后的相关资源释放;
AbstractApplicationContext:上下文接口抽象实现,核心的API,对应用上下文中的公共能力做了实现;
ConfigurableWebApplicationContext:Web应用上下文配置扩展接口,提供了Web应用的上下文配置能力;
WebServerApplicationContext:Web服务上下文,创建并管理Web应用的服务器,在该流程中嵌入的是Tomcat服务;
根据应用上下文几个核心的API设计,体会Spring源码的设计思路 , 从顶级的接口开始,不断向下扩展并且新增方法,理解抽象实现类的逻辑,以及服务运行时所依赖的具体API;
四、资源加载什么是资源,可以是各种类型的文件和配置,字节输入流的转换 , 也可以是URL资源定位,Spring框架在运行的过程中,需要依赖Resource接口实现对底层资源的访问;

推荐阅读