Spring Boot 启动过程
一切从SpringApplication.run()开始,最终返回一个ConfigurableApplicationContext

构造了一个SpringApplication对象,然后调用它的run方法。下面看下构造方法都做了什么

1、推断Web应用类型(WebApplicationType),本例中是SERVLET
2、设置 Bootstrapper、ApplicationContextInitializer 和 ApplicationListener
3、推断main方法
注意到,在设置 Bootstrapper、ApplicationContextInitializer 和 ApplicationListener 时,都调用了同一个方法getSpringFactoriesInstances



从所有 META-INF/spring.factories 文件中加载,并查找指定名称的的值

回到之前的构造方法那里,现在我们知道设置的Bootstrapper、ApplicationContextInitializer、ApplicationListener是从哪儿来的了,原来是在META-INF/spring.factories中配置的。查找指定key对应的值,然后实例化它们,并返回一个List

接下来,重头戏,调用run方法

重点看try里面的内容
首先是启动监听器来监听启动过程,这里再一次调用了熟悉的getSpringFactoriesInstances

然后,将main方法中传的参数包装成ApplicationArguments对象
紧接着,创建并配置环境,返回一个ConfigurableEnvironment对象,由于本例中是SERVLET,所以创建的是StandardServletEnvironment
然后,打印Banner
创建ApplicationContext,所有基于Spring的项目启动过程都是创建ApplicationContext

这里创建的ConfigurableApplicationContext是AnnotationConfigServletWebServerApplicationContext
有了ApplicationContext,紧接着要配置ApplicationContext

加载所有的source(其实就是class),然后实例化

这里就是一个,就是启动类


接下来,刷新容器


最终是调用Spring的applicationContext.refresh(),又看到了熟悉的一幕

最后还留了一个入口,回调子容器的onRefresh()

Spring MVC的启动是创建父子两个WebApplicationContext
在刷新容器之后,所有的Bean都已经实例化完成

afterRefresh什么也没做
最后是回调Runner,回调所有的ApplicationRunner和CommandLineRunner

至此,Spring Boot启动完成
回顾一下,
1、推断Web应用类型
2、设置Bootstrapper、ApplicationContextInitializer、ApplicationListener
3、推断main方法
4、创建并配置环境Environment
5、打印Banner
6、创建并配置ApplicationContext
7、刷新ApplicationContext(此处交由Spring处理,调用Spring的refresh()方法)实例化所有的bean
8、回调所有的ApplicationRunner和CommandLineRunner
Spring Boot 启动过程的更多相关文章
- Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动
之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void cr ...
- Spring Boot启动过程(七):Connector初始化
Connector实例的创建已经在Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动中提到了: Connector是LifecycleMBeanBase的子类,先是设置L ...
- Spring Boot启动过程及回调接口汇总
Spring Boot启动过程及回调接口汇总 链接: https://www.itcodemonkey.com/article/1431.html 来自:chanjarster (Daniel Qia ...
- Spring Boot启动过程(三)
我已经很精简了,两篇(Spring Boot启动过程(一).pring Boot启动过程(二))依然没写完,接着来. refreshContext之后的方法是afterRefresh,这名字起的真.. ...
- Spring Boot启动过程(一)
之前在排查一个线上问题时,不得不仔细跑了很多遍Spring Boot的代码,于是整理一下,我用的是1.4.3.RELEASE. 首先,普通的入口,这没什么好说的,我就随便贴贴代码了: SpringAp ...
- Spring Boot启动过程(二)
书接上篇 该说refreshContext(context)了,首先是判断context是否是AbstractApplicationContext派生类的实例,之后调用了强转为AbstractAppl ...
- Spring Boot 启动过程及 自定义 Listener等组件
一.启动过程 二.自定义组件 package com.example.jdbc.listener; import org.springframework.context.ApplicationCont ...
- 转:Spring Boot启动过程
之前在排查一个线上问题时,不得不仔细跑了很多遍Spring Boot的代码,于是整理一下,我用的是1.4.3.RELEASE. 首先,普通的入口,这没什么好说的,我就随便贴贴代码了: SpringAp ...
- Spring boot 启动过程解析 logback
使用 Spring Boot 默认的日志框架 Logback. 所有这些 POM 依赖的好处在于为开发 Spring 应用提供了一个良好的基础.Spring Boot 所选择的第三方库是经过考虑的,是 ...
随机推荐
- Kubernets二进制安装(15)之安装部署coredns
在运维主机上(mfyxw50.mfyxw.com)准备Coredns镜像文件,以docker镜像文件的方式部署到Kubernetes集群中去. 1.下载coredns镜像 [root@mfyxw50 ...
- Linux系统诊断必备技能之三:查看信息系统常用命令
一.概述 Linux操作系统的学习中,CLI下进行操作,需要掌握大量命令,Linux的命令有很多,对于命令的学习大家记住只能是熟能生巧,所以现在把日常使用命令为大家罗列一部分,仅供参考. 二.常用命令 ...
- 牛客网多校第7场 J Sudoku Subrectangles 【构造】
题目:戳这里 题意:给一个n*m的矩阵,里面由a~z及A~Z构成,问有多少个子矩阵满足任意一行或一列中都没有相同的字母. 解题思路:左上角和右下角两点可以确定一个矩阵.可以先预处理出来每个点作为一个矩 ...
- 牛客网多校第5场 H subseq 【树状数组+离散化】
题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...
- Leetcode(213)-打家劫舍II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在 ...
- 卧槽,sql注入竟然把我们的系统搞挂了
前言 最近我在整理安全漏洞相关问题,准备在公司做一次分享.恰好,这段时间团队发现了一个sql注入漏洞:在一个公共的分页功能中,排序字段作为入参,前端页面可以自定义.在分页sql的mybatis map ...
- python 编码问题随笔
原文点击这里 借用原作者的一句话"据说,每个做 Python 开发的都被字符编码的问题搞晕过,最常见的错误就是 UnicodeEncodeError.UnicodeDecodeError,你 ...
- Github App version released icons
# Github App version released icons http://shields.io/ Build Travis: https://img.shields.io/travis/U ...
- Introduction to JavaScript Source Maps
下载jquery时候发现:jquery.min.map 这什么鬼呀? https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/core.js http ...
- nodemon all in one
nodemon all in one https://nodemon.io/ https://github.com/remy/nodemon#nodemon https://www.npmjs.com ...