监察器

SpringBoot中,在配置文件中配置

发布时间:2022/10/22 22:20:42   
北京治白癜风最好医院 https://yyk.39.net/bj/zhuanke/89ac7.html

SpringBoot中,在配置文件中配置监听器。SpringBoot中spring.factories的部分组件浅分析。

开始

今天,我们把目录聚集到spring-boot中的spring.factories中,来看看这个文件中,都给了我们哪些有用的信息?

可执行组件

spring.factories事实上是一个properties文件,它通过键值对的方式,描述了一系列可执行组件,这些组件,在SpringBoot应用启动过程中,被通过读取-整理-实例化-排序的方式,放到Spring应用上下文中,然后,在合适的时机调用。每个组件都发挥着它们特殊的意义和作用。

八种类型

本文参照SpringBoot版本号为2.1.6.RELEASE。spring.factories中的配置,分成了八组,对应了八种可执行组件类型。

PropertySourceLoader,属性源加载器,用于载入属性源。

SpringApplicationRunListener,Spring应用运行监听器,用于监听Spring应用运行过程中的各种事件。

SpringBootExceptionReporter,SpringBoot异常报告器。

ApplicationContextInitializer,应用上下文初始化器,完成应用的某些初始化工作。

ApplicationListener,应用监听器,监听应用发生的各种事件。

EnvironmentPostProcessor,环境后置处理器。

FailureAnalyzer,故障分析器。

FailureAnalysisReporter,故障分析报告器。

PropertiesPropertySourceLoader

PropertiesPropertySourceLoader,Properties属性资源加载器。属性源加载器之一,它的getFileExtensions表明它可以加载properties或xml格式的文件。

PropertiesPropertySourceLoader会根据后缀名来判断,如果是xml文件,则走PropertiesLoaderUtils.loadProperties方法,如果不是,则走OriginTrackedPropertiesLoader的load方法。

YamlPropertySourceLoader

YamlPropertySourceLoader,yaml属性资源加载器。SpringBoot不仅支持xml或properties格式的配置文件,也支持yaml格式的配置文件,其后缀名为yml或yaml。

YamlPropertySourceLoader就是用来加载yaml格式的配置文件的,其load方法的核心是OriginTrackedYamlLoader类的load方法。

EventPublishingRunListener

EventPublishingRunListener,事件发布运行监听器。这是SpringBoot的spring.factories中配置的唯一一个Spring应用运行监听器。查看该监听器的源代码,发现它的作用就是通过一个多路广播器,将SpringBoot运行状态的变化,构建成事件,并广播给各个监听器。

ClearCachesApplicationListener

ClearCachesApplicationListener,清空缓存应用监听器。该监听器的作用是,当接收到上下文刷新事件时,清空当前线程的缓存。

ParentContextCloserApplicationListener

ParentContextCloserApplicationListener,父上下文关闭应用监听器。该监听器包含一个内部类,ContextCloserListener。ContextCloserListener的作用时,当收到应用上下文关闭事件后,去关闭其可能存在的活动的子上下文。

所以,ParentContextCloserApplicationListener的真实作用,其实是在当收到父上下文可用事件时,给其父级上下文绑定一个ContextCloserListener,以便在其父上下文关闭时,自己也能关闭。

FileEncodingApplicationListener

FileEncodingApplicationListener,文件编码应用监听器。该监听器实质作用是在收到应用环境准备就绪事件时,对配置中关于文件编码的配置作一个校验,判断配置中的文件编码是否和JVM系统的file.encoding一致。无配置或JVM系统的file.encoding无效的情况下,都不会报异常,但是,当JVM中的file.encoding有效,且在配置中包含了spring.mandatory-file-encoding,而二者又不一致时,就会报IllegalStateException异常。

AnsiOutputApplicationListener

AnsiOutputApplicationListener,Ansi输出应用监听器。该监听器的作用是,当收到应用环境准备就绪事件时,对Ansi输出的相关状态进行设置,并绑定到应用环境中。

ConfigFileApplicationListener

ConfigFileApplicationListener,配置文件应用监听器。该监听器主要做两件事。第一件事是,当发生应用准备就绪事件时,把日志对象转换到ConfigFileApplicationListener类上,把应用上下文添加到后置处理器中。第二件事是,当属性应用环境准备就绪事件时,获取后置处理器列表,排序,并执行每个后置处理器的postProcessEnvironment方法,直译为后置处理环境方法。

DelegatingApplicationListener

DelegatingApplicationListener,委托应用监听器。这个监听器比较有意思,它本身没有实质性的处理某事件。而是在应用环境准备就绪事件发生时,通过环境中的配置的context.listener.classes,去搜集相应的监听器。如果收集到,就会创建一个简单事件广播器实例,放到类属性上,同时,还会把收集到的监听器,绑定到该广播器上。

该监听器的另一个特性时,无论发生何事件,只要广播器实例不为空,就利用该广播器广播该事件。

也就是说,这个监听器,使得我们不需要在spring.factories文件中作文章,而是通过context.listener.classes这个配置,就可以使得我们自定义的监听器发挥作用。

换一种方式配置监听器

打开我们之前写得helloword的简单demo,找到我们写的Listener1。现在,我们尝试不在spring.factories文件写,而通过配置文件的方式使其发挥作用。

先将spring.factories文件中相关内容注释掉,重启下项目试试,发现Listener1确实没起作用。

在application.yml中添加如下配置:

重启项目,发现监听器开始发挥作用,控制台显示如下:

监听器相关输出日志

相关

SpringBoot的优点,有哪些值得我们使用的地方

自定义SpringApplication初始化器和监听器

SpringBoot中,如何自定义Spring应用运行时监听器

自定义SpringBoot的Banner和Bean名称是怎么来的?

SpringBoot如何使用命令行参数改变运行时端口号



转载请注明:http://www.aideyishus.com/lkyy/2095.html
------分隔线----------------------------