构造流程源码分析:ApplicationListener加载( 二 )
但正常情况下 , 如果无特殊需要 , 采用默认配置即可 。
针对定制化配置 , 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 的配置 。
另外一种配置形式为直接调用 setSources 方法来进行设置 , 方法源代码如下 。
private Set sources = new LinkedHashSet<>();public void setSources (Set sources) {Assert. notNull(sources, "Sources must not be nul1");this. sources = new L inkedHashSet<> ( sources);}该方法的参数为 String 集合 , 可传递类名、package 名称和 XML 配置资源 。 下面我们以类名为例进行演示 。
WithoutAnnoConfiguration 配置类代码如下 。
public class WithoutAnnoConfigurationpublic WithoutAnnoConfiguration(){System. out. println( "Wi thoutAnnoConfiguration 对象被创建");@Value("${ admin. name}")private String name ;@Value( "${admin. age}")private int age;//省略 getter/setter 方法}使用该配置的实例代码如下 。
public static void main(String[] args){SpringApplication app = new SpringApplication(SpringLearnApplication.class);Set set = new HashSet<>();set. add (WithoutAnnoConfiguration. class . getName());app . setSources(set);ConfigurableApplicat ionContext context = app . run(args);WithoutAnnoConfiguration bean = context . getBean(WithoutAnnoConfiguration.class);System. out. println(bean. getName());}运行程序 , 我们在日志中即可看到已经获取到对应类的属性值 。
无论是通过构造参数的形式还是通过 Setter 方法的形式对配置源信息进行指定 , 在 SpringBoot 中都会将其合并 。 SpringApplication 类中提供了 一个 getAllSources 方法 , 能够将两者参数进行合并 。
public Set<0bject> getAllSources() {//创建去除的 L inkedHashSetSet<0bject> allSources = new LinkedHashSet<>();// primarySources 不为空则加入 Setif (!CollectionUtils. isEmpty(this. primarySources)) {allSources . addAll(this . primarySources);// sources 不为空则加入 Setif (!CollectionUtils . isEmpty(this. sources)) {allSources . addAll(this. sources);//对 Set 进行包装 , 变为不可变的 Setreturn Collections . unmodifiableSet(allSources);}}关于 SpringApplication 类指定配置及配置源就讲到这里 , 更多相关配置信息可参考对应章节进行学习 。
小结【构造流程源码分析:ApplicationListener加载】本章内容重点围绕 SpringApplication 类的初始化过程展开 , 详细介绍了在初始化过程中Spring Boot 所 进 行 的 操 作 : Web应用类型推断 、 入 口类 推 断 、 默认的Application-Contextlnitializer 接口加载、默认的 ApplicationListener 加载、SpringApplication类的参数配置功能 ,以及针对这些操作我们能够进行的自定义组件及配置 。 建议大家在学习的过程中可配合相应的实战练习 , 获得更好的学习效果 。
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 精英|业务流程图怎么绘制?销售精英的经验之谈
- 页面|流程图怎样画?老板要我帮他做个组织结构图
- Python源码阅读-基础1
- |苹果iphone12怎么退货 iphone12退货政策流程条件攻略
- 什么是建造者模式?他在jdk、MyBatis源码怎么运用?
- CANopen源码简单讲二
- 视频|短视频源码开发,一套成熟的短视频源码应该是这样的
- 禁止拷贝构造,禁止bug
- SpringBoot构造流程源码分析:Web应用类型推断
