SpringBoot日志源码解析:日志监听器的注册方法及触发
SpringBoot日志源码解析Spring Boot 使用 Commons Logging 进行所有内部日志的记录 。 SpringBoot 同时提供了Java Util Logging、Log4J2 和 Logback 的默认配置, 都可以通过预置的配置来设置控制台和文件格式的日志输出 。 本章重点介绍如何触发 Spring Boot 日志及相关初始化处理机制 。
文章插图
LoggingApplicationListener的触发讲到日志的触发过程 , 我们首先看一下日志监听器 LoggingApplicationListener 的注册方法 , 在 之 前章节中我们已经讲到,在 Spring Boot 启 动 的 过 程 中 会 获 得META-INF/spring .factories 配置文件中的 Aplication 注册监听器 , 其中就包含日志的监听器 Logging-ApplicationListener,相关代码如下 。
# Application Listenersorg. springframework . context . ApplicationListener=\org. springframework . boot . context. logging. LoggingApplicationListener,\
【SpringBoot日志源码解析:日志监听器的注册方法及触发】当在此注册之后 , 在 SpringApplication 的构造方法中会获得实现 ApplicationListener 接口的注册监听器 , 这个监听器会被设置到 SpringApplication 的 listeners 属性当中 , 我们回顾一下之前的代码 。
public SpringApplication(ResourceLoader resourceLoader, Class>... primarySources) {setlisteners((Collection) getSpringFactoriesInstances(ApplicationL istener.class));public void setListeners(Collection extends ApplicationListener>> listeners) {this.listeners = new ArrayList<>();this. listeners . addAll(listeners);}
文章插图
在 启 动 过 程 中,SpringApplication 的 run 方 法 会 获 得 spring-boot 项 目 中 在META-INF/spring.factories 配置文件中的 Run Listeners,配置如下 。
# Run Listenersrg. springframework. boot. SpringApplicationRunL istener=\org. springframework . boot . context . event . EventPublishingRunListener
SpringApplication 的 run 方法中会获取 SpringApplicationRunListener 接口的监听注册类 , 相关代码如下 。
public ConfigurableApplicationContext run(String... args) {...SpringApplicationRunL isteners listeners = getRunListeners (args);listeners. starting();try {...listeners. started(context);.. .} catch (Throwable ex) {try {//遁知监昕器:容器正在运行listeners. running( context);} catch (Throwable ex) {}return context;private SpringApplicationRunListeners getRunListeners(String[] args) {Class>[] types = new Class>[] { SpringApplication. class, String[].class };return new SpringApplicationRunL isteners(logger, getSpringFactoriesInstances(SpringApplicationRunL istener.class, types, this, args));}
在 getRunListeners 方法中 , 通过 getSpringFactoriesInstances 方法 (之前章节讲到过 , 不再赘述) , 获得 spring.factories 中注册的 SpringApplicationRunListener 接口的实现类集合 , 默认情况下集合中只有一个 EventPublishingRunL istener 类 。
然后 , 将包含 EventPublishingRunListener 的集合封装到 SpringApplicationRunL isteners中, 在 Spring Boot 启 动过 程 的不 同 阶段 会 触发 不 同 的事 件, 比 如 上面 代 码中 的listeners .starting()等方法 。
关于 SpringApplicationRunL isteners 的功能我们已经学习过 , 当触发事件的方法被调用时 , 会遍历监听器并调用对应的方法 。 比如 , 上面调用的 listeners.starting()方法 , 会通过其内部的遍历方法 , 最终调用到 EventPublishingRunListener 的 starting 方法 , 相关源代码如下 。
class SpringApplicationRunListeners {public void starting() {for (SpringApplicationRunListener listener : this. listeners)listener . starting();}...
EventPublishingRunListener 类是 SpringApplicationRunListener 的实现类 , 因此当上面遍历 调 用 SpringApplicationRunListener 的 starting 方 法 时, 最 终 调 用 了EventPublishing-RunListener 实现的 starting 方法 , 相关代码如下 。
public class EventPublishingRunListener implements SpringApplicationRunstener,Ordered {@Overridepublic void starting() {this. initialMulticaster . multicastEvent(newApplicationStartingEvent(this. application, this.args));}}
EventPublishingRunListener 的 starting 方法会通过 SimpleApplicationEventMult-icaster 广播一一个 ApplicationStartingEvent 事件 。
该事件会触发在构造方法中注册的 LoggingApplicationListener 监听器 , 进行日志相关的逻辑处理 , 下面章节会对关于触发的事件进行详细讲解 。
文章插图
本文给大家讲解的内容是Spring Boot日志源码解析:LoggingApplicationListener的触发
- 下篇文章给大家讲解的是Spring Boot日志源码解析:LoggingApplicationListener的执行;
- Python源码阅读-基础1
- linux配置nginx定时日志分割
- 什么是建造者模式?他在jdk、MyBatis源码怎么运用?
- SpringBoot+MyBatis+MySQL读写分离实现
- CANopen源码简单讲二
- 视频|短视频源码开发,一套成熟的短视频源码应该是这样的
- SpringBoot构造流程源码分析:Web应用类型推断
- 搭建私有Sentry日志收集系统并集成到springboot
- 构造流程源码分析:ApplicationListener加载
- 巧用maven profile动态修改logback日志目录