SpringBoot日志源码解析:日志监听器的注册方法及触发

共 3371字,需浏览 7分钟

 ·

2022-04-25 07:52

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 Listeners
org. springframework . context . ApplicationListener=\
org. springframework . boot . context. logging. LoggingApplicationListener,\

当在此注册之后,在 SpringApplication 的构造方法中会获得实现 ApplicationListener 接口的注册监听器,这个监听器会被设置到 SpringApplication 的 listeners 属性当中,我们回顾一下之前的代码。

public SpringApplication(ResourceLoader resourceLoader, Class... primary
Sources)
{
setlisteners((Collection) getSpringFactoriesInstances(ApplicationL istene
r.class));
public void setListeners(Collection> liste
ners)
{
this.listeners = new ArrayList<>();
this. listeners . addAll(listeners);
}



在 启 动 过 程 中 , SpringApplication 的 run 方 法 会 获 得 spring-boot 项 目 中 在META-INF/spring.factories 配置文件中的 Run Listeners,配置如下。

# Run Listeners
rg. 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[].cla
ss };
return new SpringApplicationRunL isteners(logger, getSpringFactoriesInstan
ces(
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 SpringApplicationRunst
ener,
Ordered
{
@Override
public void starting() {
this. initialMulticaster . multicastEvent(
new
ApplicationStartingEvent(this. application, this.args));
}
}


EventPublishingRunListener 的 starting 方法会通过 SimpleApplicationEventMult-icaster 广播一一个 ApplicationStartingEvent 事件。

该事件会触发在构造方法中注册的
LoggingApplicationListener 监听器,进行日志相关的逻辑处理,下面章节会对关于触发的事件进行详细讲解。


本文给大家讲解的内容是Spring Boot日志源码解析:LoggingApplicationListener的触发

  1. 下篇文章给大家讲解的是Spring Boot日志源码解析:LoggingApplicationListener的执行;

  2. 觉得文章不错的朋友可以转发此文关注小编;

  3. 感谢大家的支持!

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

浏览 41
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报