带你从源码了解SpringBoot启动流程
从哪入手?
相信很多人尝试读过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
这个枚举类中,如下:
NONE
:顾名思义,什么都没有,正常流程走,不额外的启动web容器
,比如Tomcat
。SERVLET
:基于servlet
的web程序,需要启动内嵌的servlet
web容器,比如Tomcat
。REACTIVE
:基于reactive
的web程序,需要启动内嵌reactive
web容器,作者不是很了解,不便多说。
判断的依据很简单,就是加载对应的类,比如加载了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启动流程相关推荐
- bluetoothd源码剖析(一)启动流程
蓝牙系列: bluez调试笔记_weixin_41069709的博客-CSDN博客_bluezbluez移植https://blog.csdn.net/weixin_41069709/article/ ...
- Nginx源码分析:启动流程
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...
- Kubelet源码分析(一):启动流程分析
源码版本 kubernetes version: v1.3.0 简介 在Kubernetes急群众,在每个Node节点上都会启动一个kubelet服务进程.该进程用于处理Master节点下发到本节点的 ...
- zygoteinit.java_源码跟踪之启动流程:从ZygoteInit到onCreate
Instrumentation SDK版本名称: Pie API Level: 28 一.源码调用时序图 1. Activity的启动流程 说明:其中ActivityThread中执行的schedul ...
- CC00055.hadoop——|HadoopMapReduce.V27|——|Hadoop.v27|源码剖析|DataNode启动流程|
一.[源码剖析之DataNode启动流程] :DataNode 启动流程 ### --- datanode的Main Class是DataNode,先找到DataNode.main()public c ...
- 以太坊Go-ethereum源码分析之启动流程
以太坊源码编译需要gov1.7以上,及C编译器,执行make geth 即可编译项目,编译后可执行的geth文件. Makefile文件: geth:build/env.sh go run build ...
- Android进阶——Small源码分析之启动流程详解
前言 插件化现在已经是Android工程师必备的技能之一,只是学会怎么使用是不行的,所以蹭有时间研究一下Small的源码.对于插件化主要解决的问题是四大组件的加载和资源的加载,读懂所有Small源码需 ...
- 【Flink源码】JobManager启动流程
写在前面 在 [Flink源码]再谈 Flink 程序提交流程(中) 一文中,笔者后来发现谬误颇多,且随着 Flink 版本的更迭,部分方法实现方式已发生较大改变.因此,思虑再三决定针对 JobMan ...
- Flask1.1.4 Werkzeug1.0.1 源码分析:启动流程
基于QuickStart中的一个demo来分析 from flask import Flaskapp = Flask(__name__)@app.route("/") def he ...
最新文章
- J - Fire! UVA - 11624
- TLSNotary中心化预言机(1) TLS1.1协议
- golang key map 所有_Map的底层实现 为什么遍历Map总是乱序的
- unity连接mysql并读取所有数据库_Unity 3D 连接Mysql数据库
- php 处理像素点数组,求助:php处理这个数组
- java静态代码审查工具
- 用Notepad2替换Windows自带记事本
- go int转byte
- Python-Curses模块
- Windows Server 2008 R2 官方原版下载大全
- 第二章:如何解构一篇目标论文,从而开启自己的论文写作
- 邮件服务器lp在哪找,lp地址查询_ip地址查询定位
- 计算机实验原理word,完整word版计算机组成原理实验报告 微控制器
- ZT——你怎么过河? -在CMM实践中你是否愿意多走1公里-软件工程 CMM与过程改进
- 常用的python读写函数
- 第十七届“振兴杯”全国青年 职业技能大赛——计算机程序设计员(云计算平台与运维)参赛回顾与总结
- 信号和电源隔离的有效设计技术
- 计算机科学导论参考文献,物联网毕业论文参考文献精选
- Ubuntu安装pcb制图工具
- Unitimes程序员活动-戏精剧本杀
热门文章
- 一天一道算法题--5.30---递归
- qt 程序windows 上发布
- 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
- 2017-2018-2 20165329 实验五 网络编程与安全
- 【POJ2387】Til the Cows Come Home (最短路)
- C与c++中-什么时候用,头文件中与“”区别
- 倒水问题(Fill,UVA 10603) lrj白书 p202
- gridView删除提示框
- Objective-C策略模式(Strategy)
- Dorado 7 IDE下载地址