我们上3个篇章写了springboot的自动装配、servlet组件的注入以及web容器实现内嵌的原理,现在我们来看springboot启动过程中到底做了些什么,也就是打开我们的run方法:

这里我们可以看到我们的run方法会new出一个springboot自己的一个容器,然后执行里面的run方法,这个args参数就是我们运行项目时所带的参数;因为这里new了一个springboot容器,所以我们打开SpringApplication,看里面初始化了什么东西:

可以看到,其实springboot容器里并没有做什么事,无非是做些判断,这些判断大多是通过判断容器里是否有某个类从而进行确定,比如判断是web应用里面检查的就是容器里是否有servlet类,是否加载了spring-web这个spring源码项目;而这里的初始化文件我们可以打开:

这两个初始化大类大致上的作用是初始化监听器,下面的这个类是全局的一个监听器,通过观察者的一个设计模式,我们可以发布各种各样的事件,然后进行监听,这里就不做过长的讲解(毕竟到现在我们的run方法还没讲==!),有兴趣的可以打开这些初始化类并学习spring里的监听器内容;

最后的这个找配置类其实就是通过拿到异常方法的调用栈,找到是否有main方法,再通过main方法返回你的主配置类名:

至此,我们应该大致知道在run方法运行前springboot做了哪些操作,接下来打开springboot容器里的这个run方法:

这里挑选我觉得比较实用的内容来讲:

首先是这个从配置文件读取的SpringApplicationRunListener接口的实现类,

这里我们自定义一个MyRunListener继承这个接口,重写接口原本的方法starting、started、running等等的方法即可让容器在启动前做一些自定义的操作,注意要把这个类写进

这个配置文件中;

其实在准备初始化阶段springboot做的就是发布监听;

我们打开refreshContext(context);看看在spring容器的初始化方面springboot做了哪些改进:

可以看到这里调用的super.refresh其实就是spring里本身的refresh()极度不要脸的照搬过来哈,我们再看里面的onRefresh方法

因为这个方法是spring容器在初始化后提供我们可以对容器做出修改的方法

可以看到,springboot在初始化时做的唯一改变就是添加了对web容器的判断,看其是否内嵌:

这里就很好地结合了之前讲的内嵌web容器以及注入servlet组件的原理了;先看一下web容器,如果是外部容器,即war包启动,通过web容器带动IOC启动,想想之前的java Config技术,其实就是利用WebApplicationInitializer这个接口,实现这个接口的类在tomcat运行时会调用里面的onStartup方法,我们重写这个onStartup方法,在里面创建web应用上下文,并加入监听器,在初始化context的时候会运行run方法,即启动IOC容器,所以判断项目是jar包启动还是war包启动,如果没拿到servletcontext,那就是以jar包启动:

看这里的getSelfInitializer(),初始化的正好对应开启的就是我们之前将servlet组件注入的里的onStartup方法,我们从spring容器里拿到所有实现了SevletContextInitializer的bean,再运行onStartup方法,把这些组件加入到servletcontext中,最后再通过getWebServer方法启动和获取web容器;也就是内嵌web容器和外部容器正好相反,内嵌的web容器是通过IOC来启动web容器,而外部容器是通过web容器来启动IOC;

至此,springboot在初始化Spring容器所作的贡献已然结束,我们再回到run方法里,可以看到后面无非就是打印一些日志输出以及一些容器启动后的监听器监听事件,所有简单总结下run方法里的作用:一、初始化springboot容器(1、判断上下文环境;2、加载Spring.factories配置文件里的ApplicationContextInitializer和ApplicationListener;3、找到main方法所在类);二、启动Sring容器(发布各式各样的监听器监听、重写Spring里的onReference方法:判断是否启动内嵌tomcat)

最后,再附上一张在网上找的Springboot的启动流程图:

springboot源码(4)的更多相关文章

  1. springboot源码解读

    springboot源码从main函数开始 public static void main(String[] args) { ApplicationContext app = SpringApplic ...

  2. SpringBoot源码分析之SpringBoot的启动过程

    SpringBoot源码分析之SpringBoot的启动过程 发表于 2017-04-30   |   分类于 springboot  |   0 Comments  |   阅读次数 SpringB ...

  3. SpringBoot源码篇:深度分析SpringBoot如何省去web.xml

    一.前言 从本博文开始,正式开启Spring及SpringBoot源码分析之旅.这可能是一个漫长的过程,因为本人之前阅读源码都是很片面的,对Spring源码没有一个系统的认识.从本文开始我会持续更新, ...

  4. Springboot源码分析之项目结构

    Springboot源码分析之项目结构 摘要: 无论是从IDEA还是其他的SDS开发工具亦或是https://start.spring.io/ 进行解压,我们都会得到同样的一个pom.xml文件 4. ...

  5. SpringBoot源码学习系列之异常处理自动配置

    SpringBoot源码学习系列之异常处理自动配置 1.源码学习 先给个SpringBoot中的异常例子,假如访问一个错误链接,让其返回404页面 在浏览器访问: 而在其它的客户端软件,比如postm ...

  6. SpringBoot源码学习系列之嵌入式Servlet容器

    目录 1.博客前言简单介绍 2.定制servlet容器 3.变换servlet容器 4.servlet容器启动原理 SpringBoot源码学习系列之嵌入式Servlet容器启动原理 @ 1.博客前言 ...

  7. 【spring-boot 源码解析】spring-boot 依赖管理梳理图

    在文章 [spring-boot 源码解析]spring-boot 依赖管理 中,我梳理了 spring-boot-build.spring-boot-parent.spring-boot-depen ...

  8. SpringBoot源码解析系列文章汇总

    相信我,你会收藏这篇文章的 本篇文章是这段时间撸出来的SpringBoot源码解析系列文章的汇总,当你使用SpringBoot不仅仅满足于基本使用时.或者出去面试被面试官虐了时.或者说想要深入了解一下 ...

  9. 外部配置属性值是如何被绑定到XxxProperties类属性上的?--SpringBoot源码(五)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 SpringBoot是如何实现自动配置的?--SpringBoot源码(四) 温故而知新,我们来简单回顾一下上 ...

  10. SpringBoot是如何实现自动配置的?--SpringBoot源码(四)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三 ...

随机推荐

  1. F - Team Queue

    有n个队伍. 对于每个ENQUEUE  x 命令. 如果x所在的队伍已经在队列中, 则x排在队列中它的队伍的尾巴, 否则排在队列的末尾. 可以理解为队列中的队列的味道. Queues and Prio ...

  2. B - B Silver Cow Party (最短路+转置)

    有n个农场,编号1~N,农场里奶牛将去X号农场.这N个农场之间有M条单向路(注意),通过第i条路将需要花费Ti单位时间.选择最短时间的最优路径来回一趟,花费在去的路上和返回农场的这些最优路径的最长时间 ...

  3. Testing Round #16 (Unrated)

    比赛链接:https://codeforces.com/contest/1351 A - A+B (Trial Problem) #include <bits/stdc++.h> usin ...

  4. 矩阵树定理(Kirchhoff || Laplace)初探——Part 1(无向图计数)

    必备知识: 高斯消元,图论基本知识(好像就这...(雾)) 这里是无向图部分,请不要走错场... 定义 我们将邻接矩阵定义为矩阵A(u,v),我想邻接矩阵就不用再多说了: 我们将每个点的度数矩阵定义为 ...

  5. 【poj 2891】Strange Way to Express Integers(数论--拓展欧几里德 求解同余方程组 模版题)

    题意:Elina看一本刘汝佳的书(O_O*),里面介绍了一种奇怪的方法表示一个非负整数 m .也就是有 k 对 ( ai , ri ) 可以这样表示--m%ai=ri.问 m 的最小值. 解法:拓展欧 ...

  6. P1268 树的重量(板子)

    题目: 题目描述 树可以用来表示物种之间的进化关系.一棵"进化树"是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题是,根据物种之 ...

  7. A - 敌兵布阵 ——B - I Hate It——C - A Simple Problem with Integers(线段树)

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  8. Codeforces #Round 632 div2 A~C

                                       A. Little Artem   Young boy Artem tries to paint a picture, and h ...

  9. flex & align-content & justify-items

    flex & align-content & justify-items align-content 多行 align-items 的对其方式 https://developer.mo ...

  10. GIF : 超好用的gif 图片制作工具: LICEcap

    超好用的gif 图片制作工具: LICEcap simple animated screen captures http://www.cockos.com/licecap/https://github ...