Spring Application实例化流程和构造方法参数

SpringBoot构造流程源码分析Spring Boot 的启动非常简单 , 只需执行一-个简单的 main 方法即可 , 但在整个 main 方法中 , Spring Boot 都做了些什么呢?本章会为大家详细讲解 Spring Boot 启动过程中所涉及的源代码和相关知识点 。 只有了解 Spring Boot 启动时都做了些什么 , 我们在实践过程中才能更好地运用 Spring Boot,更好地排查问题 , 并借鉴 Spring Boot 的设计理念进行创新 。
我们再来看一下 Spring Boot 的启动入口类源代码 。
@SpringBootApplicationpublic class SpringLearnApplication {public static void main(String[] args) {SpringApplication. run(SpringLearnApplication. class, args);}}在上一章中 , 我们通过入口类的@SpringBootApplication 注解展开讲解 了SpringBoot的核 心 机 制。而 本 章 则 围 绕 SpringApplication 类 的 静 态 方 法 一 run 方 法 的 初 始 化 类SpringApplication 自身的功能进行讲解 。
Spring Application实例化流程和构造方法参数文章插图
SpringApplication的初始化简介【Spring Application实例化流程和构造方法参数】在入口类中主要通过 SpringApplication 的静态方法一-run 方 法进行 SpringApplication类的实例化操作 , 然后再针对实例化对象调用另外-个 run 方法来完成整个项目的初始化和启动 。 本章重点围绕此过程的前半部部分(即 SpringApplication 类的实例化)来讲解 。
public class SpringApplication {public static ConfigurableApplicationContext run(Class primarySource,return run(new Class[] { primarySource }, args);public static ConfigurableApplicat ionContext run(Class[] primarySourceString[] args) {//创建 SpringApplication 对象并执行其 run 方法return new SpringApplication(primarySources). run(args);}}通过入口类的方法进入 , 可以看到 SpringApplication 的实例化只是在它提供的静态 run 方法中新建了一个 SpringApplication 对象 。 其中参数 primarySources 为加载的主要资源类 , 通常就是 Spring Boot 的入口类 , args 为传递给应用程序的参数信息 。
借鉴 SpringApplication 内部 run 方法的实现 , 我们也可以直接新建一个 SpringApplication对象 , 并调用其 run 方法 。 因此 , 启动程序也可以如此来写:
@SpringBootApplicationpublic class Springl earnApplication {public static void main(String[] args)new SpringApplication(SpringL earnApplication.class).run(args); }}这样写程序的一个好处便是 , 可以通过 SpringApplication 提供的一 -些方法(setXX 或addXX 方法)来进行指定功能的定制化设置 。
下面将重点围绕 SpringApplication 类的实例化展开 。
Spring Application实例化流程和构造方法参数文章插图
SpringApplication 实例化流程上面我们了解了进行 SpringApplication 实例化的基本方法 , 下面我们先通过一-张简单的流程图来系统地学习在创建 SpringApplication 对象时都进行了哪些核心操作 , 如图 3-1 所示 。
Spring Application实例化流程和构造方法参数文章插图
通过图 3-1 可以看出 , 在 SpringApplication 对象实例化的过程中主要做了 3 件事:参数赋值给成员变量、应用类型及方法推断和 ApplicationContext 相关内容加载及实例化 。
我们结合流程图看一下 SpringApplication 两个构造方法的核心源代码 。
public SpringApplication(Class