国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot之自定義啟動異常堆棧信息打印方式

瀏覽:95日期:2023-02-18 16:10:12

在SpringBoot項目啟動過程中,當(dāng)一些配置或者其他錯誤信息會有一些的規(guī)范的提示信息

***************************APPLICATION FAILED TO START***************************

Description:

Web server failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port.

在SpringBoot 中其實現(xiàn)原理是什么,我們該如何自定義異常信息呢

1、SpringBoot異常處理的源碼分析

在springboot啟動的核心方法run中會加載所有的SpringBootExceptionReporter

exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[] { ConfigurableApplicationContext.class }, context);

調(diào)用了getSpringFactoriesInstances方法

private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) { ClassLoader classLoader = getClassLoader(); // Use names and ensure unique to protect against duplicates Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader)); List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names); AnnotationAwareOrderComparator.sort(instances); return instances; }

其主要通過Spring的Factories機制來加載

public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>(); configureHeadlessProperty(); SpringApplicationRunListeners listeners = getRunListeners(args); listeners.starting(); try { ApplicationArguments applicationArguments = new DefaultApplicationArguments(args); ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); configureIgnoreBeanInfo(environment); Banner printedBanner = printBanner(environment); context = createApplicationContext(); exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[] { ConfigurableApplicationContext.class }, context); prepareContext(context, environment, listeners, applicationArguments, printedBanner); refreshContext(context); afterRefresh(context, applicationArguments); stopWatch.stop(); if (this.logStartupInfo) { new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch); } listeners.started(context); callRunners(context, applicationArguments); } catch (Throwable ex) { //異常捕獲中,向用戶打印異常信息 handleRunFailure(context, ex, exceptionReporters, listeners); throw new IllegalStateException(ex); } try { listeners.running(context); } catch (Throwable ex) { handleRunFailure(context, ex, exceptionReporters, null); throw new IllegalStateException(ex); } return context; }

在try catch中,catch會打印異常信息

private void handleRunFailure(ConfigurableApplicationContext context, Throwable exception, Collection<SpringBootExceptionReporter> exceptionReporters, SpringApplicationRunListeners listeners) { try { try { handleExitCode(context, exception); if (listeners != null) { listeners.failed(context, exception); } } finally { reportFailure(exceptionReporters, exception); if (context != null) { context.close(); } } } catch (Exception ex) { logger.warn('Unable to close ApplicationContext', ex); } ReflectionUtils.rethrowRuntimeException(exception); }

private void reportFailure(Collection<SpringBootExceptionReporter> exceptionReporters, Throwable failure) { try { for (SpringBootExceptionReporter reporter : exceptionReporters) { if (reporter.reportException(failure)) { registerLoggedException(failure); return; } } } catch (Throwable ex) { // Continue with normal handling of the original failure } if (logger.isErrorEnabled()) { logger.error('Application run failed', failure); registerLoggedException(failure); } }

遍歷exceptionReporters,打印日常信息

SpringBoot之自定義啟動異常堆棧信息打印方式

SpringBootExceptionReporter是一個回調(diào)接口,用于支持對SpringApplication啟動錯誤的自定義報告。里面就一個報告啟動失敗的方法。

其實現(xiàn)類:org.springframework.boot.diagnostics.FailureAnalyzers

用于觸發(fā)從spring.factories加載的FailureAnalyzer和FailureAnalysisReporter實例。

2、如何自定義異常信息

/** * <p> * * <p> * * @author: xuwd * @time: 2020/11/16 10:52 */public class WannaStopException extends RuntimeException {}

自定義異常信息打印

public class StopFailureAnalyzerextends AbstractFailureAnalyzer<WannaStopException> { @Override protected FailureAnalysis analyze(Throwable rootFailure, WannaStopException cause) {for (StackTraceElement stackTraceElement : cause.getStackTrace()) { if (stackTraceElement.getClassName().equals('com.pigx.demo.Config21')) {return new FailureAnalysis('A想停止', '別要A了', cause); }}return null; }}

接下來令他生效,通過上面分析可以可看出需要通過AutoConfigurationImportSelector,類似于自定義SpringBoot Starter AutoConfiguration的形式,我們需要在META-INF/spring.factories文件內(nèi)進行定義,如下所示:

SpringBoot之自定義啟動異常堆棧信息打印方式

接著在合適的地方拋出WannaStopException 異常

總結(jié)

在springboot 啟動過程中會先對異常信息進行補捕獲,對進行日志格式處理的日志進行處理;其核心是通過SpringBootExceptionReporter回調(diào)及sping-spi bean的管理。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 91日韩精品天海翼在线观看 | 色欧美hdvideosxs4k| 欧美精品1 | 3级毛片| 日本一级特黄大一片免 | 欧美成人免费看片一区 | 亚洲综合日韩精品欧美综合区 | 免费精品久久久久久中文字幕 | 亚洲第一se情网站 | 真实国产精品视频国产网 | 久久久久久久久国产 | 国产免费网 | 亚洲综合图片人成综合网 | 香港黄页亚洲一级 | 久久久精品久久久久久久久久久 | 91色综合综合热五月激情 | 久久精品久久精品 | 我想看三级特黄 | 欧美大屁股精品毛片视频 | 96精品视频在线播放免费观看 | 久久毛片网 | 九九视频在线 | 一级毛片在线免费视频 | 国产精品11p | 日韩中文字幕网 | 亚洲第一页乱 | 亚洲自偷自拍另类12p | 久久w5ww成w人免费不卡 | 俄罗斯小屁孩cao大人免费 | 57pao强力打造手机版 | 国产欧美在线观看 | 免费一级欧美片在线观免看 | 欧美三级欧美成人高清www | 色综合久久久高清综合久久久 | 九九视频在线播放 | 欧美一级欧美一级高清 | 狠狠色综合久久丁香婷婷 | 在线成人精品国产区免费 | 欧美 自拍| 国产美女主播一级成人毛片 | 男人又粗又硬桶女人免费 |