Spring Boot 2.x 启动全过程源码分析(上):入口类剖析

栏目: Java · 发布时间: 6年前

内容简介:Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boot 为什么这么简便的奥秘。本篇基于做过 Spring Boot 项目的都知道,上面是 Spring Boot 最简单通用的入口类。入口类的要求是最顶层包下面第一个含有 main 方法的类,使用注解

Spring Boot 2.x 启动全过程源码分析(上):入口类剖析

Java技术栈

www.javastack.cn

优秀的 Java 技术公众号

Spring Boot 2.x 启动全过程源码分析(上):入口类剖析

Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boot 为什么这么简便的奥秘。

本篇基于 Spring Boot 2.0.3 版本进行分析,阅读本文需要有一些 Java 和 Spring 框架基础, 如果还不知道 Spring Boot 是什么,建议先看下我们的 Spring Boot 教程

Spring Boot 的入口类

做过 Spring Boot 项目的都知道,上面是 Spring Boot 最简单通用的入口类。入口类的要求是最顶层包下面第一个含有 main 方法的类,使用注解 @SpringBootApplication 来启用 Spring Boot 特性,使用 SpringApplication.run 方法来启动 Spring Boot 项目。

来看一下这个类的 run 方法调用关系源码:

第一个参数 primarySource :加载的主要资源类

第二个参数 args :传递给应用的应用参数

先用主要资源类来实例化一个 SpringApplication 对象,再调用这个对象的 run 方法,所以我们分两步来分析这个启动源码。

SpringApplication 的实例化过程

Spring Boot 2.x 启动全过程源码分析(上):入口类剖析

接着上面的 SpringApplication 构造方法进入以下源码:

可知这个构造器类的初始化包括以下 7 个过程。

1、资源初始化资源加载器为 null

2、断言主要加载资源类不能为 null,否则报错

3、初始化主要加载资源类集合并去重

4、推断当前 WEB 应用类型

来看下 deduceWebApplicationType 方法和相关的源码:

这个就是根据类路径下是否有对应项目类型的类推断出不同的应用类型。

5、设置应用上线文初始化器

ApplicationContextInitializer 的作用是什么?源码如下。

用来初始化指定的 Spring 应用上下文,如注册属性资源、激活 Profiles 等。

来看下 setInitializers 方法源码,其实就是初始化一个 ApplicationContextInitializer 应用上下文初始化器实例的集合。

再来看下这个初始化 getSpringFactoriesInstances 方法和相关的源码:

设置应用上下文初始化器可分为以下 5 个步骤。

5.1)获取当前线程上下文类加载器

5.2)获取 ApplicationContextInitializer 的实例名称集合并去重

loadFactoryNames 方法相关的源码如下:

根据类路径下的 META-INF/spring.factories 文件解析并获取 ApplicationContextInitializer 接口的所有配置的类路径名称。

spring-boot-autoconfigure-2.0.3.RELEASE.jar!/META-INF/spring.factories 的初始化器相关配置内容如下:

5.3)根据以上类路径创建初始化器实例列表

5.4)初始化器实例列表排序

5.5)返回初始化器实例列表

6、设置监听器

ApplicationListener 的作用是什么?源码如下。

看源码,这个接口继承了 JDK 的 java.util.EventListener 接口,实现了观察者模式,它一般用来定义感兴趣的事件类型,事件类型限定于 ApplicationEvent 的子类,这同样继承了 JDK 的 java.util.EventObject 接口。

设置监听器和设置初始化器调用的方法是一样的,只是传入的类型不一样,设置监听器的接口类型为: getSpringFactoriesInstances ,对应的 spring-boot-autoconfigure-2.0.3.RELEASE.jar!/META-INF/spring.factories 文件配置内容请见下方。

可以看出目前只有一个 BackgroundPreinitializer 监听器。

7、推断主入口应用类

这个推断入口应用类的方式有点特别,通过构造一个运行时异常,再遍历异常栈中的方法名,获取方法名为 main 的栈帧,从来得到入口类的名字再返回该类。

总结

源码分析内容有点多,也很麻烦,本章暂时分析到 SpringApplication 构造方法的初始化流程, 下章再继续分析其 run 方法,作者很快写完过两天就发布,扫码关注下面的公众号 "Java技术栈" 即可获取推送更新。

源码分析不易,点赞 + 转发支持一下吧!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

我是90后,我是创业家

我是90后,我是创业家

腾讯互联网与社会研究院 / 华章图书 / 2015-1-1 / 48.00元

第1本揭秘17个90后精彩创业故事 他们是:脸萌创始人郭列、北大硕士卖米粉的张天一、微博《我只过1%的生活》短时间转发35万多次的伟大的安妮、备受争议的90后总裁余佳文、节操姐CEO陈桦……17位90后的创业家为你分享他们的创业故事!从这些90后孩子的经历中,还可以看到互联网带来的巨大好处,这又是这一代人的幸运。这些创业者有一个共同特点,即他们在做自己事业的时候,会经常遇到来自家庭和社会的阻......一起来看看 《我是90后,我是创业家》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具