初窥spring boot 源码之框架初始化

简介: 从Spring boot 框架初始化深入理解框架是怎么实现的

Spring boot 启动流程

框架初始化

所谓框架初始化,可以说是new 一个  SpringApplication 对象,调用其构造方法时会进行如下步骤的操作!

实际框架初始化流程,

  1. 配置资源加载器,默认启动,资源加载器是null (可以在启动时指定类加载器)
  2. 判断primarySources(servlet项目会将启动主类传入构造方法)不能为空,接下来为SpringApplication 设置primarySources
  3. 调用推断应用所属类型,webflux or none or servlet 应用环境检测 *具体方法在后面有详细写*
  4. 设置系统初始化器-》通过SpringFactoriesLoader 获取ApplicationContextInitializer 相关实现类,主要是扫描jar包下META-INF目录下的spring.factories 文件中的对应类配置
  5. 设置应用监听器-》也是通过SpringFactoriesLoader 获取ApplicationListener 相关实现类,
  6. 配置mainApplicationClass属性,也就是设置main方法所在类

探寻如上流程时,遇到一些有意思的方法

1.SpingApplication 下的 getClassLoader 方法 还会关联到 ClassUtils 中的 getDefaultClassLoader 方法,该方法应该是与双亲委派的代码很是类似。由此看出,我能看出什么呢。这个getDefaultClassLoader 方法呢,就有意思了,如果当前线程有这么一个加载器的话,就用当前线程的,没有则找到ClassUtils类的加载器,如果还是null,那么就使用systemclassloader

2.再一个就是,Throwable 类中会记录一个StackTraceElement,该元素会记录一些内容,比如当前方法所属的类名称。方法名字。。。

这个是在设置main 方法类的时候发现的。

现在深入的研究一波,getSpringFactoriesInstances 方法解析 第4步

1.先获取类加载器

2.通过SpringFactoriesLoader 的loadFactoryNames方法获 调用loadSpringFactories方法 到了set里面,保证名字的唯一

3.createSpringFactoriesInstances 方法进行对象的实例化,先通过ClassUtils.forName 获取到Class对象,再校验是否为需求的子类,通过Class对象及入参创建对应的构造方法对象,通过BeanUtils.instantiatieClass方法创建对象,并把对象放到集合中,返回对象集合。

4.对这些对象,进行一次排序根据其自定义实现的排序逻辑,或者排序器进行排序 很多都是通过order值。

loadSpringFactories流程

  1. 查缓存中是否包含对应数据,如果有直接返回,没有进行下一步
  2. 读取到META-INF目录下的spring.factories 文件
  3. 构造properties 对象所有的kv数据,通过遍历将这些接口及实现的名字拿到,
  4. 之后基于定义的接口名字为key,具体实现为value(value被声明为一个list)(接口的多个实现用“,”分割,有方法进行分割)包装到一个map中,基于这个map 取到type的具体实现类名的集合,将得到的数据放到缓存中
  5. 返回结果

框架启动

框架启动也就是在得到一个springApplication对象以后,进行的run方法的执行。执行会携带启动命令!

探秘框架启动流程

  1. 计时器开始-》new stopwatch().start()
  2. Headless 模式赋值
  3. 获取SpringApplicationRunListeners  spring-boot 框架的sping-factorise 配置文件下指定了默认的启动监听器 并发送一个ApplicationStartingEvent -》 这是个扩展点
  4. 将启动参数包装成一个对象 也就是命令行启动时的参数会通过这一步配置到 applicationArguments 对象中
  5. 配置环境数据,这个方法是配置引入的入口后面进行展开。发送一个 ApplicationEnvironmentPreparedEvent标识环境信息已经准备好了处理忽略的相关内容 -》这也是个有意思的地方
  6. 根据已经加载了配置信息的environment对象创建打印banner对象
  7. 创建应用上下文对象
  8. 创建失败分析器
  9. prepareContext 准备上下文对象 下面有详解
  10. refreshContext(context); 对上下文进行刷新,bean的初始化都在这个方法中,后面会拓展。下一个方法在默认启动中没有具体实现代码逻辑,可能是为了实现设置的。
  11. 停止计时-》 打印启动哪个类 用了多长时间 的日志
  12. 发送started事件
  13. 调用runners方法 对启动加载器进行处理
  14. 如果以上从第4步到12步有异常或者错误发生,就会通过失败分析器,发出相关失败信息。
  15. 没啥事儿再发个框架正常启动的事件,然后将上下文对象

image.png

以上为框架初始化及启动相关流程,大家加油。

相关文章
|
5天前
|
Web App开发 编解码 Java
B/S基层卫生健康云HIS医院管理系统源码 SaaS模式 、Springboot框架
基层卫生健康云HIS系统采用云端SaaS服务的方式提供,使用用户通过浏览器即能访问,无需关注系统的部署、维护、升级等问题,系统充分考虑了模板化、配置化、智能化、扩展化等设计方法,覆盖了基层医疗机构的主要工作流程,能够与监管系统有序对接,并能满足未来系统扩展的需要。
33 4
|
24天前
|
缓存 前端开发 Java
【Java】仓库管理系统 SpringBoot+LayUI+DTree(源码)【独一无二】
【Java】仓库管理系统 SpringBoot+LayUI+DTree(源码)【独一无二】
|
1天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
8天前
|
人工智能 移动开发 前端开发
Springboot医院智慧导诊系统源码:精准推荐科室
医院智慧导诊系统是在医疗中使用的引导患者自助就诊挂号,在就诊的过程中有许多患者不知道需要挂什么号,要看什么病,通过智慧导诊系统,可输入自身疾病的症状表现,或选择身体部位,在经由智慧导诊系统多维度计算,精准推荐科室,引导患者挂号就诊,实现科学就诊,不用担心挂错号。
18 2
|
9天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
148 10
|
9天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
10天前
|
存储 数据可视化 安全
Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术
智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合。无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、丰富多彩的校园文化、方便周到的校园生活。简而言之,“要做一个安全、稳定、环保、节能的校园。
35 6
|
12天前
|
消息中间件 运维 供应链
springboot区域云HIS医院信息综合管理平台源码
云HIS系统分为两个大的系统,一个是基层卫生健康云综合管理系统,另一个是基层卫生健康云业务系统。基层卫生健康云综合管理系统由运营商、开发商和监管机构使用,用来进行运营管理、运维管理和综合监管。基层卫生健康云业务系统由基层医院使用,用来支撑医院各类业务运转。
21 2
|
17天前
|
缓存 前端开发 Java
SpringBoot启动后加载初始化数据
SpringBoot启动后加载初始化数据
|
23天前
|
JavaScript Java 关系型数据库
基于 java + Springboot + vue +mysql 大学生实习管理系统(含源码)
本文档介绍了基于Springboot的实习管理系统的设计与实现。系统采用B/S架构,旨在解决实习管理中的人工管理问题,提高效率。系统特点包括对用户输入的验证和数据安全性保障。功能涵盖首页、个人中心、班级管理、学生管理、教师管理、实习单位管理、实习作业管理、教师评分管理、单位成绩管理和系统管理等。用户分为管理员、教师和学生,各自有不同的操作权限。