当前位置: 监察器 >> 监察器介绍 >> SpringBoot中,在配置文件中配置
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如何使用命令行参数改变运行时端口号