Java技术栈
www.javastack.cn
优秀的Java技术公众号
Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boot 为什么这么简便的奥秘。
本篇基于 Spring Boot 2.0.3 版本进行分析,阅读本文需要有一些 Java 和 Spring 框架基础, 如果还不知道 Spring Boot 是什么,建议先看下我们的 Spring Boot 教程 。
做过 Spring Boot 项目的都知道,上面是 Spring Boot 最简单通用的入口类。入口类的要求是最顶层包下面第一个含有 main 方法的类,使用注解 @SpringBootApplication
来启用 Spring Boot 特性,使用 SpringApplication.run
方法来启动 Spring Boot 项目。
来看一下这个类的 run
方法调用关系源码:
第一个参数 primarySource
:加载的主要资源类
第二个参数 args
:传递给应用的应用参数
先用主要资源类来实例化一个 SpringApplication
对象,再调用这个对象的 run
方法,所以我们分两步来分析这个启动源码。
接着上面的 SpringApplication
构造方法进入以下源码:
可知这个构造器类的初始化包括以下 7 个过程。
来看下 deduceWebApplicationType
方法和相关的源码:
这个就是根据类路径下是否有对应项目类型的类推断出不同的应用类型。
ApplicationContextInitializer
的作用是什么?源码如下。 用来初始化指定的 Spring 应用上下文,如注册属性资源、激活 Profiles 等。
来看下 setInitializers
方法源码,其实就是初始化一个 ApplicationContextInitializer
应用上下文初始化器实例的集合。
再来看下这个初始化 getSpringFactoriesInstances
方法和相关的源码:
设置应用上下文初始化器可分为以下 5 个步骤。
ApplicationContextInitializer
的实例名称集合并去重 loadFactoryNames
方法相关的源码如下:
根据类路径下的 META-INF/spring.factories
文件解析并获取 ApplicationContextInitializer
接口的所有配置的类路径名称。
spring-boot-autoconfigure-2.0.3.RELEASE.jar!/META-INF/spring.factories
的初始化器相关配置内容如下:
ApplicationListener
的作用是什么?源码如下。 看源码,这个接口继承了 JDK 的 java.util.EventListener
接口,实现了观察者模式,它一般用来定义感兴趣的事件类型,事件类型限定于 ApplicationEvent 的子类,这同样继承了 JDK 的 java.util.EventObject
接口。
设置监听器和设置初始化器调用的方法是一样的,只是传入的类型不一样,设置监听器的接口类型为: getSpringFactoriesInstances
,对应的 spring-boot-autoconfigure-2.0.3.RELEASE.jar!/META-INF/spring.factories
文件配置内容请见下方。
可以看出目前只有一个 BackgroundPreinitializer
监听器。
这个推断入口应用类的方式有点特别,通过构造一个运行时异常,再遍历异常栈中的方法名,获取方法名为 main 的栈帧,从来得到入口类的名字再返回该类。
源码分析内容有点多,也很麻烦,本章暂时分析到 SpringApplication
构造方法的初始化流程, 下章再继续分析其 run
方法,作者很快写完过两天就发布,扫码关注下面的公众号 "Java技术栈" 即可获取推送更新。
往期干货推荐
1. Spring Boot 2.x 新特性总结及迁移指南
2. Spring Boot 集成 Mybatis 实现双数据源
3. Spring Boot 核心配置文件详解
4. Spring Boot 单元测试详解+实战教程
5. Spring Boot 自动配置原理、实战
Java技术栈 • 长按关注