一切从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

最新文章

  1. C 标准库系列之float.h
  2. java中return与finally的执行顺序
  3. 在Excel中将数字转换为大写
  4. gcview使用
  5. 测试xss
  6. 3D数学 矩阵常用知识点整理
  7. Less or Equal CodeForces - 977C (sort+细节)
  8. ArcGIS鼠标滚轮方向之代码篇
  9. poj3278_kuagnbin带你飞专题一
  10. apply、call、bind的区别
  11. 16.2 profile 显示或者隐藏页面 修改密码
  12. Go语言之进阶篇文件传输
  13. MySql(二):MySql架构组成
  14. PHP方便快捷的将二维数组中元素的某一列值抽离出来作为此二维数组内元素的key
  15. setsid
  16. 重记解决kube-dns故障一则---ceph惹的祸
  17. 863. All Nodes Distance K in Binary Tree
  18. 【字符串处理算法】字符串包含的算法设计及C代码实现【转】
  19. 【DFS】【枚举】Gym - 101246G - Revolutionary Roads
  20. Python 简单说明与数据结构

热门文章

  1. HDU - 4462 Scaring the Birds
  2. HDU 6704 K-th occurrence(主席树 + RMQ + 后缀数组)题解
  3. 杭电多校HDU 6601 Keen On Everything But Triangle(主席树)题解
  4. 016.NET5_MVC_视图组件扩展定制
  5. CSS 滚动条宽度 All In One
  6. 使用 js 实现十大排序算法: 选择排序
  7. Chrome console & Command Line API
  8. Beacon API
  9. Huffman coding & Huffman tree
  10. Service Worker in Action