public static void main(String[] args) { //进入run方法 SpringApplication.run(Demo2Application.class, args); }
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) { //进入run方法 return run(new Class<?>[] { primarySource }, args); }
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { //进入run方法 return new SpringApplication(primarySources).run(args); }
在这个方法里面获取异常报告器的实例,就是在spring.factories文件
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[] { ConfigurableApplicationContext.class }, context);
# Error Reporters 就是SpringBootExceptionReporter下所有的数据 org.springframework.boot.SpringBootExceptionReporter=\ org.springframework.boot.diagnostics.FailureAnalyzers
我们可以自定义一个异常报告器的类
//自定义异常报告器 public class MyExceptionReporter implements SpringBootExceptionReporter { private ConfigurableApplicationContext context; //实例化构造方法 如果不实例化会报错 报 Cannot instantiate interface //java.lang.NoSuchMethodException: com.example.demo2.config.MyExceptionReporter. // <init>(org.springframework.context.ConfigurableApplicationContext) public MyExceptionReporter(ConfigurableApplicationContext context){ this.context=context; } @Override public boolean reportException(Throwable failure) { System.out.println("打印异常信息=="+failure.fillInStackTrace()); //返回false打印详细信息 返回true只打印异常信息 return false; } }
//然后在spring.factories文件中注册自定义的异常报告器
# 注册异常报告器 org.springframework.boot.SpringBootExceptionReporter=\ com.example.demo2.config.MyExceptionReporter
//我们在看下异常的信息,这里就读取到了我们配置的信息
//我们可以在application.properties文件设置,端口大一点,我们看下报错信息
# 应用服务 WEB 访问端口 server.port=808011111
//我们找到ServletWebServerApplicationContext类的startWebServer方法这里就是启动web服务
//我们在点击start()进入, 选择TomcatWebServer的类
//我们可以看到在启动的时候会打印 Tomcat started on port(s):xxx
//点击addPreviouslyRemovedConnectors()方法,我们可以看到有http连接的信息
//然后我们回到这个方法checkThatConnectorsHaveStarted();
//当连接失败的时候我们会进入这里
//如果报错 就会进入这个方法,我们点进去
handleRunFailure(context, ex, exceptionReporters, listeners);
//handleExitCode获取当前系统exitCode,等到最后日志打印完了,就直接停止System.exit(exitCode)
//我们点击reportFailure方法,选择reportException
//会进入我们自定义的异常报告器,和FailureAnalyzers异常报告器
//然后我们在选择report进入这里
//点击reporter.report(analysis)进入LoggingFailureAnalysisReporter类
//在这里我们可以看到buildMessage就是封装好的打印报错信息
//那么这里打印的就是我们的详细信息,就是我们经常报错的日志
//如果我们自定义异常报告器设置的true ,我们回到这个SpringApplication类的reportFailure方法
//就直接在这里停止,就不会走FailureAnalyzers类的报告信息,也不会打印报错信息
//因为我们的自定义异常报告器实现了SpringBootExceptionReporter
MyExceptionReporter implements SpringBootExceptionReporter
//所以我们有reportException方法,在循环的时候会进来
//最后通过源码的分析,我们很快的就能定位到问题出现了在哪里,然后解决就可以了