日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

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

在SpringBoot項目啟動過程中,當一些配置或者其他錯誤信息會有一些的規(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)。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩亚洲一区在线| 蜜桃av在线播放| 精品一区二区三区中文字幕 | 日本国产精品| 91一区二区三区四区| av日韩中文| 国产成人精品一区二区免费看京 | 亚洲国产影院| 午夜日韩av| 亚洲精品高潮| 国产精品久久久久久模特 | 日韩国产在线观看| 国产精品资源| 日韩和欧美一区二区三区| 美女视频免费精品| 欧美久久亚洲| 精品欧美久久| 视频一区二区不卡| 成人一二三区| 热久久久久久| 国产精品片aa在线观看| 久久久噜噜噜| 日韩午夜精品| 国产欧美日韩影院| 欧美国产极品| 好看的亚洲午夜视频在线| 久久xxxx精品视频| 97久久中文字幕| 美女性感视频久久| 欧洲亚洲一区二区三区| 99riav1国产精品视频| 精品久久美女| jiujiure精品视频播放| 国产成人精品一区二区三区免费 | 蘑菇福利视频一区播放| 国产伦理一区| 狠狠爱www人成狠狠爱综合网| 国产精品videossex久久发布 | 欧美精品一卡| 亚洲一区二区免费在线观看| 日本蜜桃在线观看视频| 欧美午夜三级| 亚洲另类视频| 岛国av在线网站| 国产日韩高清一区二区三区在线| 亚洲欧美日本国产专区一区| 久久蜜桃精品| 久久久久久婷| 久久女人天堂| 日韩精品成人| 欧美va亚洲va日韩∨a综合色| 欧美一区网站| 欧美三区四区| 亚洲三区欧美一区国产二区| 蜜桃tv一区二区三区| 亚洲精品动态| 黄色av日韩| 久久久国产精品入口麻豆| 丝袜国产日韩另类美女| 国产精品久久国产愉拍| 91亚洲精品视频在线观看| 伊人久久在线| 色婷婷色综合| 亚洲无线观看| 中文字幕日韩亚洲| 国产美女高潮在线观看| 欧美黄色一区二区| 模特精品在线| 蜜乳av另类精品一区二区| 精品五月天堂| 日韩高清在线观看一区二区| 丝袜av一区| 播放一区二区| 免费观看在线综合色| 偷拍欧美精品| 国产一区丝袜| 四虎成人av| 亚洲免费福利一区| 亚洲日本国产| av亚洲在线观看| 一区在线视频观看| 亚洲五月综合| 精品久久福利| 无码日韩精品一区二区免费| 久久久人人人| 欧美影院三区| 精品五月天堂| 国产成人精品亚洲线观看| 国产免费成人| 亚洲综合精品| 日韩免费高清| 999久久久91| 国产高清精品二区| 九九九精品视频| 欧美日韩一区二区三区在线电影| 日韩动漫一区| 亚洲尤物在线| 视频一区欧美精品| 九一国产精品| 亚洲专区视频| 欧美日韩国产高清| 中文字幕日本一区| 好吊一区二区三区| 亚洲午夜91| 国模大尺度视频一区二区| 91视频久久| 久久福利在线| 日韩精品1区| 国产精品麻豆成人av电影艾秋| 国产精品一区二区免费福利视频| 日韩精品视频在线看| 麻豆精品视频在线| 国产精品中文| 日韩欧美字幕| 精品国产免费人成网站| 九九久久婷婷| 国产精品99一区二区| 美女久久网站| 欧美性感美女一区二区| 中文视频一区| 久久不射网站| 日韩不卡一区二区三区 | 日韩在线网址| 国产欧美成人| 久久精品72免费观看| 成人高清一区| а√天堂8资源在线| 亚洲免费成人| 国产午夜久久| 国产日韩一区二区三区在线播放| 日本不卡一二三区黄网| 在线免费观看亚洲| 综合激情五月婷婷| 久久男人av| 精品国产麻豆| 不卡视频在线| 国产精品毛片在线| 久久精品国产成人一区二区三区| 麻豆精品少妇| а√天堂8资源在线| 92国产精品| 麻豆精品网站| 蜜桃av一区二区| 国产高清亚洲| 国产成人调教视频在线观看| 国产高清不卡| 精品国产乱码久久久久久樱花| av在线最新| 亚洲午夜久久久久久尤物| 国产欧洲在线| 久久精品动漫| 美女视频黄久久| 高潮一区二区| 欧美日韩va| 国产免费播放一区二区| 五月天久久777| 久久一二三区| 精品国产第一福利网站| 日韩不卡在线| 精品亚洲精品| 91精品在线观看国产| 视频精品一区| 另类小说一区二区三区| 欧美日韩在线观看视频小说| 中文字幕色婷婷在线视频| 国产欧美88| 日本少妇一区二区| 久久要要av| 国产精品高颜值在线观看| 亚洲ww精品| 日韩成人精品一区二区三区| 国产精品nxnn| 欧美gv在线| 国产精品激情电影| 国产欧美日韩影院| 亚洲一区二区免费在线观看| 成人一二三区| 日本在线观看不卡视频| 国产一区亚洲| 日本午夜精品视频在线观看| 91精品在线免费视频| 羞羞答答国产精品www一本| 91av亚洲| 亚洲丝袜啪啪| 亚洲不卡av不卡一区二区| 99在线精品免费视频九九视| 国产精品毛片久久久| 水蜜桃久久夜色精品一区| 激情欧美一区| 美女精品网站| 亚洲精品裸体| 青青草91久久久久久久久| 欧美日韩亚洲一区二区三区在线| 精品三级国产| 亚洲区欧美区| 99国产精品私拍| 麻豆视频一区二区| 激情欧美日韩一区| 日韩国产欧美视频| 日韩高清成人|