springboot源码分析之SpringBootExceptionReporter

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方法,在循环的时候会进来

//最后通过源码的分析,我们很快的就能定位到问题出现了在哪里,然后解决就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值