从哪入手?

相信很多人尝试读过Spring Boot的源码,但是始终没有找到合适的方法。那是因为你对Spring Boot的各个组件、机制不是很了解,研究起来就像大海捞针。

至于从哪入手不是很简单的问题吗,当然主启动类了,即是标注着@SpringBootApplication注解并且有着main()方法的类,如下一段代码:

@SpringBootApplication
public class AnnotationDemoApplication {public static void main(String[] args) {SpringApplication.run(AnnotationDemoApplication.class, args);}
}

源码如何切分?

SpringApplication中的静态run()方法并不是一步完成的,最终执行的源码如下:

//org.springframework.context.ConfigurableApplicationContext
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {return new SpringApplication(primarySources).run(args);}

如何创建SpringApplication?

创建即是new对象了,DEBUG跟进代码,最终执行的SpringApplication构造方法如下图:

设置应用类型

这个过程非常重要,直接决定了项目的类型,应用类型分为三种,都在WebApplicationType这个枚举类中,如下:

  1. NONE:顾名思义,什么都没有,正常流程走,不额外的启动web容器,比如Tomcat
  2. SERVLET:基于servlet的web程序,需要启动内嵌的servletweb容器,比如Tomcat
  3. REACTIVE:基于reactive的web程序,需要启动内嵌reactiveweb容器,作者不是很了解,不便多说。

判断的依据很简单,就是加载对应的类,比如加载了DispatcherServlet等则会判断是Servlet的web程序。源码如下:

static WebApplicationType deduceFromClasspath() {if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null)&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) {return WebApplicationType.REACTIVE;}for (String className : SERVLET_INDICATOR_CLASSES) {if (!ClassUtils.isPresent(className, null)) {return WebApplicationType.NONE;}}return WebApplicationType.SERVLET;}

这里我引入了spring-boot-starter-web,肯定是Servlet的web程序。

设置初始化器(Initializer)

初始化器ApplicationContextInitializer是个好东西,用于IOC容器刷新之前初始化一些组件,比如ServletContextApplicationContextInitializer

那么如何获取初始化器呢?跟着上图中的代码进入,在SpringApplication中的如下图中的方法:

相对重要的就是第一步获取初始化器的名称了,这个肯定是全类名了,详细源码肯定在loadFactoryNames()方法中了,跟着源码进入,最终调用的是#SpringFactoriesLoader.loadSpringFactories()方法。

loadSpringFactories()方法就不再详细解释了,其实就是从类路径META-INF/spring.factories中加载ApplicationContextInitializer的值。

设置监听器(Listener)

监听器(ApplicationListener)这个概念在Spring中就已经存在,主要用于监听特定的事件(ApplicationEvent),比如IOC容器刷新、容器关闭等。

Spring Boot扩展了ApplicationEvent构建了SpringApplicationEvent这个抽象类,主要用于Spring Boot启动过程中触发的事件,比如程序启动中、程序启动完成等。

监听器如何获取?从源码中知道其实和初始化器(ApplicationContextInitializer)执行的是同一个方法,同样是从META-INF/spring.factories文件中获取。

总结

SpringApplication的构建都是为了run()方法启动做铺垫,构造方法中总共就有几行代码,最重要的部分就是设置应用类型、设置初始化器、设置监听器。

带你从源码了解SpringBoot启动流程相关推荐

  1. bluetoothd源码剖析(一)启动流程

    蓝牙系列: bluez调试笔记_weixin_41069709的博客-CSDN博客_bluezbluez移植https://blog.csdn.net/weixin_41069709/article/ ...

  2. Nginx源码分析:启动流程

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...

  3. Kubelet源码分析(一):启动流程分析

    源码版本 kubernetes version: v1.3.0 简介 在Kubernetes急群众,在每个Node节点上都会启动一个kubelet服务进程.该进程用于处理Master节点下发到本节点的 ...

  4. zygoteinit.java_源码跟踪之启动流程:从ZygoteInit到onCreate

    Instrumentation SDK版本名称: Pie API Level: 28 一.源码调用时序图 1. Activity的启动流程 说明:其中ActivityThread中执行的schedul ...

  5. CC00055.hadoop——|HadoopMapReduce.V27|——|Hadoop.v27|源码剖析|DataNode启动流程|

    一.[源码剖析之DataNode启动流程] :DataNode 启动流程 ### --- datanode的Main Class是DataNode,先找到DataNode.main()public c ...

  6. 以太坊Go-ethereum源码分析之启动流程

    以太坊源码编译需要gov1.7以上,及C编译器,执行make geth 即可编译项目,编译后可执行的geth文件. Makefile文件: geth:build/env.sh go run build ...

  7. Android进阶——Small源码分析之启动流程详解

    前言 插件化现在已经是Android工程师必备的技能之一,只是学会怎么使用是不行的,所以蹭有时间研究一下Small的源码.对于插件化主要解决的问题是四大组件的加载和资源的加载,读懂所有Small源码需 ...

  8. 【Flink源码】JobManager启动流程

    写在前面 在 [Flink源码]再谈 Flink 程序提交流程(中) 一文中,笔者后来发现谬误颇多,且随着 Flink 版本的更迭,部分方法实现方式已发生较大改变.因此,思虑再三决定针对 JobMan ...

  9. Flask1.1.4 Werkzeug1.0.1 源码分析:启动流程

    基于QuickStart中的一个demo来分析 from flask import Flaskapp = Flask(__name__)@app.route("/") def he ...

最新文章

  1. J - Fire! UVA - 11624
  2. TLSNotary中心化预言机(1) TLS1.1协议
  3. golang key map 所有_Map的底层实现 为什么遍历Map总是乱序的
  4. unity连接mysql并读取所有数据库_Unity 3D 连接Mysql数据库
  5. php 处理像素点数组,求助:php处理这个数组
  6. java静态代码审查工具
  7. 用Notepad2替换Windows自带记事本
  8. go int转byte
  9. Python-Curses模块
  10. Windows Server 2008 R2 官方原版下载大全
  11. 第二章:如何解构一篇目标论文,从而开启自己的论文写作
  12. 邮件服务器lp在哪找,lp地址查询_ip地址查询定位
  13. 计算机实验原理word,完整word版计算机组成原理实验报告 微控制器
  14. ZT——你怎么过河? -在CMM实践中你是否愿意多走1公里-软件工程 CMM与过程改进
  15. 常用的python读写函数
  16. 第十七届“振兴杯”全国青年 职业技能大赛——计算机程序设计员(云计算平台与运维)参赛回顾与总结
  17. 信号和电源隔离的有效设计技术
  18. 计算机科学导论参考文献,物联网毕业论文参考文献精选
  19. Ubuntu安装pcb制图工具
  20. Unitimes程序员活动-戏精剧本杀

热门文章

  1. 一天一道算法题--5.30---递归
  2. qt 程序windows 上发布
  3. 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
  4. 2017-2018-2 20165329 实验五 网络编程与安全
  5. 【POJ2387】Til the Cows Come Home (最短路)
  6. C与c++中-什么时候用,头文件中与“”区别
  7. 倒水问题(Fill,UVA 10603) lrj白书 p202
  8. gridView删除提示框
  9. Objective-C策略模式(Strategy)
  10. Dorado 7 IDE下载地址