一 main方法作为程序的入口,执行SpringApplication.run(),传入参数是启动类的class对象@SpringBootApplication注解

二 run中首先new SpringApplication对象,然后调用该对象的run方法,返回是一个ConfigurableApplicationContext对象。

三 这里我们先看new SpringApplication的时候会进行什么操作,run方法随后在看,这段代码中的每一步依次来说:

  1.使用了Assert.notNull来判断空值是一个良好的习惯,Assert类来自core的org.springframework.util包下,该包提供了很多工具类,之后会单独有一篇介绍  spring提供给我们好用的工具类的文章。

  2.其中会deduceFromClasspath(deduce意为“推断”)应用类型是servlet还是reactive

classPath中这三个最少有一个

并且这两个全都有才是一个web应用

  3.getSpringFactoriesInstance(ApplicationContextInitiliazer.class)方法从spring-boot包下的"META-INF/spring.factories"路径加载ClassLoader

该文件:

这种方式更容易看懂共有八个接口分别对应多个实现类:

其中只取key为ApplicationContextInitializer的value返回,该value是个List<String>,是实现了ApplicationContextInitializer接口的实现类名称,以“,”分隔

然后将这些类进行加载,这些类指的是:

之后同样的方式加载ApplicationListener接口的实现类:

4.判定主程序是哪个类

通过遍历栈信息,找到调用main方法的类型,将其加载,赋值给变量mainApplicationClass

四 SpringApplication的run方法

其中重要的逻辑都用黄色框圈了出来:

  1.加载所有的监听器,和上述一样,加载指定好的类都是根据spring.factories中的对应的监听器,加载EventPublishingRunListener,之后调用该类的starting:

 

之后调用该类的starting方法,对之前加载的所有ApplicationListener根据事件类型进行广播事件(multicastEvent):

  2.准备容器环境,会依据之前推断(deduce)的应用类型返回对应的环境对象:   

 

  之后由监听器执行enviromentPrepared方法,其中需要注意的是会有一个监听器叫:ConfigFileApplicationListener,该接口的实现类会实际加载yml或.properties的配置文件:

  

  

  

随后在执行ConfigFileApplicationLitener的postProcessEnviroment方法时,会加载factories的PropertySourceLoader对应的实现类:

来加载yml或.properties中的配置,至此,容器环境配置完成。

  3.创建容器上下文createApplicationContext(),也是依据之前的应用类型推断结果:

  

  之后准备容器上下文:

  

  首先将创建的context中的enviroment全部替换为springApplication中刚刚创建的enviroment,然后向context中注册beanfactory:

  

  然后用当前context作为参数,调用springApplication中所有的intilizer实现类执行,intilize方法,其中重点关注COnfigurationWaringsApplicationContextInitializer类的该方法:

  

  所有的listener执行contetxPrepared方法,之后向beanfacotry中注册两个参数,之后是load方法:

      创建了一个beanDefinitionLoader对象,该对象最主要支持了xml加载和annotated加载方式,加载所有source中的对象,这里只有一个主类,被@Component注解(注解继承),将其注入到beanfactory中的beanDefinitionMap中

  

  在refreshContext中会加载所有的bean到beanFactory中:

    

    

  至此,就将所有的bean由容器来管理。

SpringBoot启动流程与源码的更多相关文章

  1. SpringBoot启动嵌入式tomcat源码解读

    一.SpringBoot自动拉起Tomcat SpringBoot框架是当前比较流行的java后端开发框架,与maven结合大大简化了开发人员项目搭建的步骤,我们知道SpringBoot的启动类启动后 ...

  2. 从SpringBoot启动,阅读源码设计

    目录 一.背景说明 二.SpringBoot工程 三.应用上下文 四.资源加载 五.应用环境 六.Bean对象 七.Tomcat服务 八.事件模型 九.配置加载 十.数据库集成 十一.参考源码 服务启 ...

  3. Spring源码解析02:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  4. Spring源码解析 | 第二篇:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  5. SpringBoot启动流程解析

    写在前面: 由于该系统是底层系统,以微服务形式对外暴露dubbo服务,所以本流程中SpringBoot不基于jetty或者tomcat等容器启动方式发布服务,而是以执行程序方式启动来发布(参考下图ke ...

  6. SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  7. SpringBoot启动流程分析(六):IoC容器依赖注入

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  8. SpringBoot启动流程分析(一):SpringApplication类初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  9. SpringBoot启动流程分析(二):SpringApplication的run方法

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

随机推荐

  1. PHP curl put方式上传文件

    发送端: <?php function curlPut($destUrl, $sourceFileDir, $headerArr = array(), $timeout = ) { $ch = ...

  2. php 微信公众平台OAuth2.0网页授权,获取用户信息代码类封装demo

    get_wx_data.php <?php /** * 获取微信用户信息 * @author: Lucky hypo */ class GetWxData{ private $appid = ' ...

  3. composer autoload优化

    为生产环境作准备 最后提醒一下,在部署代码到生产环境的时候,别忘了优化一下自动加载: composer dump-autoload --optimize 安装包的时候可以同样使用--optimize- ...

  4. div定位relative和absolute和float测试3

    position等于absolute的时候,不一定是相对于浏览器定位,当div存在包含关系时,父div设置成relative,其中包含的div设置成absolute就是相对于该父div的了.该文测试了 ...

  5. Node.js 服务端图片处理利器

    sharp 是 Node.js 平台上相当热门的一个图像处理库,其实际上是基于 C 语言编写 的 libvips 库封装而来,因此高性能也成了 sharp 的一大卖点.sharp 可以方便地实现常见的 ...

  6. CRC校验的问题(c语言实现CRC校验和)

    1. 前面的数 7A 01 00,计算的结果是0X4920 2. 那么把数据CRC加上 3. 测试代码,计算出来的结果对不上,什么情况?可是我把参考模型的全部都选了一遍,也对不上其中一个!!! 4.  ...

  7. CentOS 7 新装服务器部署流程

    目录 1.设置时区 2.配置内网IP (如果是外网IP,linux要修改远程端口) 3.配置自己的yum源 4.关闭SELinux 5.添加zabbix监控 6.关闭防火墙和NM 7.安装软件包 8. ...

  8. 解释张量及TF的一些API

    张量的定义 张量(Tensor)理论是数学的一个分支学科,在力学中有重要应用.张量这一术语起源于力学,它最初是用来表示弹性介质中各点应力状态的,后来张量理论发展成为力学和物理学的一个有力的数学工具.张 ...

  9. 推荐两本CCF教材

    希望学习电脑程序设计的同学,可以购买如下两本教材,先学习入门篇,再学习基础篇.淘宝.当当.京东均有售.建议选择比较靠谱的网店,避免买到盗版书.

  10. IntelliJ IDEA 下搭建vue项目工程

    Vue 项目:运行 npm run dev  后报错 “'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件.” 前提: 电脑已经安装了node 和 npm, ...