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

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

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

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

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

***************************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 中其實現原理是什么,我們該如何自定義異常信息呢

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

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

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

調用了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是一個回調接口,用于支持對SpringApplication啟動錯誤的自定義報告。里面就一個報告啟動失敗的方法。

其實現類:org.springframework.boot.diagnostics.FailureAnalyzers

用于觸發從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文件內進行定義,如下所示:

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

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

總結

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
最新国产拍偷乱拍精品| 日韩高清在线不卡| 亚洲一区二区动漫| 九九精品调教| 日韩欧美二区| 在线观看精品| 久久成人亚洲| 在线精品一区| 亚洲综合电影一区二区三区| 久久国产电影| 亚洲成人一区| 日韩成人一级| 国产精品s色| 模特精品在线| 国产盗摄——sm在线视频| 成人午夜在线| 婷婷激情一区| 久色成人在线| 日本欧美久久久久免费播放网| 亚洲精品a级片| 日韩高清一区| 国产日韩精品视频一区二区三区| 久久精品欧洲| 亚洲精品99| 国产精品久久久久久久久久妞妞| 日韩国产一区二区三区| 国产精品一区二区美女视频免费看| 日韩在线短视频| 免费日韩av片| 久久伊人久久| 国内亚洲精品| 91午夜精品| 99成人超碰| 日韩av成人高清| 国产精品97| 伊人久久av| 日韩精品免费观看视频| 高清在线一区| 欧美专区一区| 免费在线欧美视频| 美女视频网站久久| 亚洲午夜久久| 久久久久久久久丰满| 激情久久中文字幕| 国产精品theporn| 2023国产精品久久久精品双| 国产精品一二| 亚洲欧美在线专区| 国产欧美自拍一区| 日韩在线卡一卡二| 日韩av首页| 精品国产乱码久久久| 亚洲九九精品| 国产综合婷婷| 精品精品99| 久久av资源| 国内在线观看一区二区三区| 蜜桃视频在线观看一区二区| 国产精品美女午夜爽爽| 免费日本视频一区| 成人羞羞视频播放网站| 美女久久久久久| 国产日本精品| 亚洲日本免费电影| 日韩在线综合| 国产96在线亚洲| 美女视频黄免费的久久| 国产精品视频3p| 欧美精品1区| 久久亚洲人体| 福利一区二区三区视频在线观看| 欧美交a欧美精品喷水| 国产一区精品福利| 亚洲黄色免费av| 国产精品对白| 国产精品普通话对白| 欧美成人综合| 亚洲区国产区| 麻豆成人91精品二区三区| 欧美国产极品| 久久久蜜桃一区二区人| 另类中文字幕国产精品| 国产日韩亚洲欧美精品| 国产中文在线播放| 日本不卡视频在线观看| 欧美天堂在线| 成人在线视频中文字幕| 色婷婷精品视频| 尤物网精品视频| 日韩欧美高清一区二区三区| 欧美在线观看天堂一区二区三区| 国产 日韩 欧美 综合 一区| 日韩一区二区三免费高清在线观看 | jizzjizz中国精品麻豆| 日韩在线短视频| 在线亚洲自拍| 亚洲欧美日本日韩| 国产精品乱战久久久| 婷婷亚洲综合| 91精品国产91久久久久久黑人| 亚洲美洲欧洲综合国产一区 | 一区在线观看| 国产精品sm| 日韩中文字幕亚洲一区二区va在线| 国产精品欧美一区二区三区不卡| 日韩av免费| 亚洲啊v在线免费视频| 国产另类在线| 欧美~级网站不卡| 亚洲专区视频| 精品中文字幕一区二区三区av| 日韩av一二三| 香蕉久久久久久久av网站| 欧美激情综合| 国产农村妇女精品一二区| 蜜芽一区二区三区| 日本精品一区二区三区在线观看视频| 日韩有吗在线观看| 亚洲主播在线| 亚洲国产福利| 精品一区二区三区的国产在线观看 | 久久国产人妖系列| 激情久久婷婷| 999精品色在线播放| 久久人人97超碰国产公开结果| 国产成人精品免费视| 高清一区二区三区av| 国际精品欧美精品| 麻豆视频久久| 中文另类视频| 久久中文字幕av一区二区不卡| 亚洲一级二级| 成人在线视频免费看| 免费中文字幕日韩欧美| 一区在线视频观看| 天堂а√在线最新版中文在线| аⅴ资源天堂资源库在线| 国产 日韩 欧美 综合 一区| 精品无人区麻豆乱码久久久| 精品中国亚洲| 国语对白精品一区二区| 美女性感视频久久| 国产日韩在线观看视频| 中文字幕av一区二区三区人 | 日韩精品dvd| 给我免费播放日韩视频| 日韩免费福利视频| 日韩精品看片| 日韩视频二区| 最新日韩av| 日本亚洲欧美天堂免费| 一本大道色婷婷在线| 在线看片一区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 91看片一区| 久久蜜桃av| 亚洲欧美日韩精品一区二区| 亚洲免费观看高清完整版在线观| 91麻豆精品| 色88888久久久久久影院| 精品国产欧美| 亚洲欧美网站| 国产精品一区二区精品视频观看 | 在线一区av| 日韩精品一级| 久久国产99| 美女国产精品久久久| 日韩和的一区二在线| 欧美日韩调教| 国产aⅴ精品一区二区四区| 欧美亚洲在线日韩| 久久国产尿小便嘘嘘| 视频福利一区| 国产精品一级在线观看| 另类国产ts人妖高潮视频| 国产精品欧美日韩一区| 亚洲天堂久久| 石原莉奈在线亚洲二区| 国产日韩欧美一区在线| 国产精品女主播一区二区三区| 国产人成精品一区二区三| 91精品国产自产在线观看永久∴| 成人看片网站| 亚洲美洲欧洲综合国产一区| 亚洲一区二区三区四区五区午夜 | а√天堂8资源中文在线| 日韩一区二区三区精品| 欧美一级一区| 久久久国产精品入口麻豆| 成人一区而且| 欧美成人日韩| 少妇精品久久久一区二区三区| 日本精品一区二区三区在线观看视频| 亚洲人成毛片在线播放女女| 亚洲一二三区视频| 国产精品一二| 久久五月天小说| 亚洲精品乱码日韩| 狠狠久久伊人| 欧美日韩精品免费观看视频完整|