构造流程源码分析:ApplicationListener加载( 二 )
private Class> deduceMainApplicationClass() {/获取栈元素数组StackTraceElement[] stackTrace = new Runt imeException() . getStackTrace()//遍历栈元素数组for (StackTraceElement stackTraceElement : stackTrace) {//匹配第一个 main 方法 , 并返回("main" . equals(stackTraceElement , getMethodName())) {return Class. forName( stackTraceElement . getClassName());} catch (ClassNotFoundException ex) {//如果发生异常 , 忽略该异常 , 并继续执行return null;}
该方法实现的基本流程就是先创建一个运行时异常 ,然后获得栈数组 , 遍历栈数组 , 判断类的方法中是否包含 main 方法 。 第-个被匹配的类会通过 Class.forName 方法创建对象 , 并 将 其 被 返 回,最 后 在 上 层 方 法 中 将 对 象 赋 值 给 SpringApplication 的 成 员 变 量mainApplicationClass 。 在遍历过程中如果发生异常 , 会忽略掉该异常并继续执行遍历操作 。
至此 , 整个 SpringApplication 类的实例化过程便完成 了 。
文章插图
SpringApplication的定制化配置前面我们学习了 Spring Boot 启动过程中构建 SpringApplication 所做的一系列初始化操作 , 这些操作都是 Spring Boot 默认配置的 。 如果在此过程中需要定制化配置 , Spring Boot 在SpringApplication 类中也提供了相应的入口 。
但正常情况下 , 如果无特殊需要 , 采用默认配置即可 。
针对定制化配置 , Spring Boot 提供了如基于入口类、配置文件、环境变量、命令行参数等多种形式 。 下面我们了 解一下几种不同的配置形式 。
基础配置
基础配置与在 application.properties 文件中的配置-样 ,用来修改 SpringBoot 预置的参数 。
比如 , 我们想在启动程序的时候不打印 Banner 信息 , 可以通过在 application.properties 文件 中 设 置 “spring.main.banner-mode=off 来 进 行 关 闭。当 然,我 们 也 可 以 通 过SpringApplication 提供的相关方法来进行同样的操作 。 以下是官方提供的关闭 Banner 的代码 。
public static void main(String[] args) {SpringApplication app = new SpringApplication(MySpringConfiguration.class);app. setBannerMode( Banner .Mode.0FF);app. run(args);}
除了前面讲到的 setInitializers 和 setL isteners 方法之外 , 其他的 Setter 方法都具有类似的功能 , 比如我们可以通过 setWebApplicationType 方法来代替 Spring Boot 默认的自动类型推断 。
针对这些 Setter 方法 , SpringBoot 还专门提供了流式处理类 SpringApplicationBuilder,我们将它的功能与 SpringApplication 逐一对照 , 可知 SpringApplicationBuilder 的优点是使代码更加简洁、流畅 。
其他相同配置形式的功能就不再赘述了 , 我们可通过查看源代码进行进一步的学习 。 出于集中配置、方便管理的思路 ,不建议大家在启动类中配置过多的参数 。 比如 , 针对 Banner的设置 , 我们可以在多处进行配置 , 但为了方便管理 , 尽可能的统一在 application.properties文件中 。
配置源配置
除了直接通过 Setter 方法进行参数的配置 , 我们还可以通过设置配置源参数对整个配置文件或配置类进行配置 。 我们可通过两个途径进行配置:
SpringApplication 构造方法参数或 SpringApplication 提供的 setSources 方法来进行设置 。
在 3.3 节 SpringApplication 构造方法参数中已经讲到可以通过 Class...primarySources参数来配置普通类 。
因此 , 配置类可通过 SpringApplication 的构造方法来进行指定 。 但这种方法有一一个弊端就是无法指定 XML 配置和基于 package 的配置 。
推荐阅读
- Git服务器配置错误导致日产汽车源码在网上泄露
- 用户|操作流程更优、功能更多、信息更加安全,你的“随申码”改版升级啦
- 健康|“健康连云港服务号”微信小程序发布,打通医疗健康全流程
- 禁止拷贝构造,禁止bug
- C语言火车订单管理源码
- Spring Application实例化流程和构造方法参数
- 工业机械手臂外部模式使用流程及注意事项
- 清华教授整理535本编程电子书+视频教程+项目源码限时领取
- 掌握会用了,为什么还要源码学习?
- 阿里爆款SpringBoot项目实战PDF+源码+视频分享