1. 程式人生 > >Springboot內建ApplicationListener--ClasspathLoggingApplicationListener

Springboot內建ApplicationListener--ClasspathLoggingApplicationListener

原始碼分析

本文原始碼基於 Springboot 2.1.0

/*
 * Copyright 2012-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.boot.context.logging; import java.net.URLClassLoader; import java.util.Arrays; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; import org.springframework.
boot.context.event.ApplicationFailedEvent; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.GenericApplicationListener; import org.springframework.context.event.SmartApplicationListener; import org.springframework.core.ResolvableType; /** * A GenericApplicationListener that reacts to * ApplicationEnvironmentPreparedEvent environment prepared events and to * ApplicationFailedEvent failed events by logging the classpath of the thread * context class loader (TCCL) at DEBUG level. * * 在環境準備完成事件ApplicationEnvironmentPreparedEvent或者應用失敗事件ApplicationFailedEvent * 發生時,DEBUG級別日誌輸出執行緒上下文類載入器的classpath。 * * 執行緒上下文類載入器:TCCL,thread context class loader * * 該類定義為GenericApplicationListener的原因是它要響應多種事件型別: * ApplicationEnvironmentPreparedEvent型別和ApplicationFailedEvent型別 * * @author Andy Wilkinson * @since 2.0.0 */
public final class ClasspathLoggingApplicationListener implements GenericApplicationListener { private static final int ORDER = LoggingApplicationListener.DEFAULT_ORDER + 1; private static final Log logger = LogFactory .getLog(ClasspathLoggingApplicationListener.class); @Override public void onApplicationEvent(ApplicationEvent event) { // 僅在DEBUG級別日誌進行輸出 if (logger.isDebugEnabled()) { if (event instanceof ApplicationEnvironmentPreparedEvent) { logger.debug("Application started with classpath: " + getClasspath()); } else if (event instanceof ApplicationFailedEvent) { logger.debug( "Application failed to start with classpath: " + getClasspath()); } } } @Override public int getOrder() { return ORDER; } @Override public boolean supportsEventType(ResolvableType resolvableType) { Class<?> type = resolvableType.getRawClass(); if (type == null) { return false; } return ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(type) || ApplicationFailedEvent.class.isAssignableFrom(type); } private String getClasspath() { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if (classLoader instanceof URLClassLoader) { return Arrays.toString(((URLClassLoader) classLoader).getURLs()); } return "unknown"; } }

輸出類似於:
2018-11-17 18:54:05.382 DEBUG [main] org.springframework.boot.context.logging.ClasspathLoggingApplicationListener : Application started with classpath: […]

相關文章

Springboot內建ApplicationListener