一切从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 启动过程的更多相关文章

  1. Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动

    之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void cr ...

  2. Spring Boot启动过程(七):Connector初始化

    Connector实例的创建已经在Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动中提到了: Connector是LifecycleMBeanBase的子类,先是设置L ...

  3. Spring Boot启动过程及回调接口汇总

    Spring Boot启动过程及回调接口汇总 链接: https://www.itcodemonkey.com/article/1431.html 来自:chanjarster (Daniel Qia ...

  4. Spring Boot启动过程(三)

    我已经很精简了,两篇(Spring Boot启动过程(一).pring Boot启动过程(二))依然没写完,接着来. refreshContext之后的方法是afterRefresh,这名字起的真.. ...

  5. Spring Boot启动过程(一)

    之前在排查一个线上问题时,不得不仔细跑了很多遍Spring Boot的代码,于是整理一下,我用的是1.4.3.RELEASE. 首先,普通的入口,这没什么好说的,我就随便贴贴代码了: SpringAp ...

  6. Spring Boot启动过程(二)

    书接上篇 该说refreshContext(context)了,首先是判断context是否是AbstractApplicationContext派生类的实例,之后调用了强转为AbstractAppl ...

  7. Spring Boot 启动过程及 自定义 Listener等组件

    一.启动过程 二.自定义组件 package com.example.jdbc.listener; import org.springframework.context.ApplicationCont ...

  8. 转:Spring Boot启动过程

    之前在排查一个线上问题时,不得不仔细跑了很多遍Spring Boot的代码,于是整理一下,我用的是1.4.3.RELEASE. 首先,普通的入口,这没什么好说的,我就随便贴贴代码了: SpringAp ...

  9. Spring boot 启动过程解析 logback

    使用 Spring Boot 默认的日志框架 Logback. 所有这些 POM 依赖的好处在于为开发 Spring 应用提供了一个良好的基础.Spring Boot 所选择的第三方库是经过考虑的,是 ...

随机推荐

  1. GO - 高级编程

    https://books.studygolang.com/gopl-zh/ https://chai2010.cn/advanced-go-programming-book/

  2. servlet相关知识点

    一.servlet的生命周期 Servlet(Sever Applet),全称是Java Servlet,是用java编写的服务器程序.Servlet是指任何实现了这个Servlet接口的类. ser ...

  3. 【非原创】codeforces 1070C Cloud Computing 【线段树&树状数组】

    题目:戳这里 学习博客:戳这里 题意:有很多个活动,每个活动有持续天数,每个活动会在每天提供C个CPU每个CPU价格为P,问需要工作N天,每天需要K个CPU的最少花费. 解题思路:遍历每一天,维护当前 ...

  4. 洛谷p1886滑动窗口最大最小值 双单调队列

    #include <iostream> #include <cstdio> using namespace std; int n,k,a[1000007],q1[2000007 ...

  5. Ubuntu 18.04 + pip3 install virtualenvwrapper 找不到virtualenvwrapper.sh

    Reference Ubuntu 18.04 只自带python3.6.5, 因此不想装python2了, 但通过apt install 装virtualenvwrapper时发现必须得装python ...

  6. 使用 Canvas 实现一个类似 Google 的可视化的页面错误反馈库

    使用 Canvas 实现一个类似 Google 的可视化的页面错误反馈库 iframe 嵌套 iframe iframe 包含 复制的 HTML 页面 和支持可以拖拽的工具栏 鼠标经过上面,智能识别 ...

  7. How to use JavaScript to implement precise setTimeout and setInterval

    How to use JavaScript to implement precise setTimeout and setInterval 如何使用 JavaScript 实现精确的 setTimeo ...

  8. TS & error

    TS & error Function implementation is missing or not immediately following the declaration.ts ht ...

  9. asm 查看字节码

    a.asm global Start section .text inc dword [esi] push edi mov edi,[esp+0x14] λ nasm -f win32 a.asm - ...

  10. Redis 博文索引

    博文索引 Redis 对象与编码 Redis 持久化 Redis 主从复制 Redis 哨兵 Redis 缓存淘汰 Redis 集合统计 Redis 简介