自定义配置文件及失败分析器
改变项目配置的方式
默认行为:
Spring Boot默认的配置文件:调用SpringApplication的run()方法启动Spring Boot应用时,Spring Boot会自动加载主配置类(run方法第一个参数、该参数要用@SpringBootApplication修饰)所在包及其子包下所有的配置文件或组件。
自定义配置文件的方式:
1、通过scanBasePackages属性:该属性来自于@ComponentScan,被属性被集成到了@SpringBootApplication中,如果显式指定了scanBasePackages属性,那就相当于覆盖了该属性的默认值。
该属性的默认值就是主配置类所在的包。
2、@Import注解来加载自定义的Java配置类。
如果自定义的配置类已经位于主配置类所在包或其子包下,
该配置类本身就会被自动加载,因此无需使用@Import注解来进行配置。
当自定义的配置类不在于主配置类所在包及其子包下,才需使用@Import注解来进行配置。
3、@ImportResource注解来加载自定义的XML配置文件,如果项目需要使用传统的XML配置文件,就可使用该注解来完成导入
【备注】:XML配置文件,需要显式使用 @ImportResource注解来加载
=========================================================
方式1、通过scanBasePackages属性:该属性来自于@ComponentScan,被属性被集成到了@SpringBootApplication中,如果显式指定了scanBasePackages属性,那就相当于覆盖了该属性的默认值。
该属性的默认值就是主配置类所在的包。
这里我自定义一个配置类,用注解 @Configuration 表明这个类作为配置类,然后用注解 @Bean 在容器中配置了一个 myDate 的Bean。
因为这个配置类是在主配置类所在的包里面,所以在启动主配置类BootApplication的时候,就会把我自己自定义的配置类的Bean加载到spring的容器中。
通过成功打印出来的myDate,可以看出配置文件已经生效了。
方式2、@Import注解来加载自定义的Java配置类。
如果自定义的配置类已经位于主配置类所在包或其子包下,
该配置类本身就会被自动加载,因此无需使用@Import注解来进行配置。
测试这句: 当自定义的配置类不在于主配置类所在包及其子包下,才需使用@Import注解来进行配置。
当自定义的配置类不在于主配置类所在包及其子包下,直接报错:No bean named ‘myDate02’ available
@Import注解来进行配置,把不在主配置类的包及其包下面的自定义配置类,通过@Import(类名.class) 的方法,显示指定要加载MyConfig02这个配置文件。
方式3、@ImportResource注解来加载自定义的XML配置文件,如果项目需要使用传统的XML配置文件,就可使用该注解来完成导入
【备注】:XML配置文件,需要显式使用 @ImportResource注解来加载
写一个xml配置文件,然后在主配置类(启动类)里面用注解@ImportResource来显示指定加载这个自定义的xml配置类。
可以看出启动主配置类后,自定义的xml配置类也生效了。
启动日志和自定义失败分析器
Spring Boot默认显示INFO级别的日志消息,包括一些和启动相关的详情
如果项目作为产品级别进行部署运行的时候,如果不想看到这些详细的启动日志,
要关闭启动日志,在application.properties中设置:spring.main.log-startup-info=false
我个人认为这个失败分析器是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
没有失败分析器时,可启动debug模式来显示错误信息
主要有两种方式:
▲ 运行程序时,添加--debug选项。
java -jar firstboot-0.0.1-SNAPSHOT.jar --debug
▲ 将ConditionEvaluationReportLoggingListener的日志级别设置debug
logging.level.org.springframework.boot.autoconfigure.logging=debug
它意味着将org.springframework.boot.autoconfigure.logging包下所有类的日志级别设为的debug
logging.level.org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener=debug
自定义失败分析器
没有失败分析器时,可开发自定义的失败分析器
两步:
(1)实现失败分析器类, 继承AbstractFailureAnalyzer<T>,其中T代表要处理的异常。
实现该抽象基类时,就需要实现如下的抽象方法
实现FailureAnalysis analyze(Throwable rootFailure, T cause)方法,
该方法的返回值就代表了失败分析器所分析得到的结果。
返回的FailureAnalysis 即可包含3个信息:
- description:失败的描述信息。第1个构造参数。
- action:针对失败的修复建议。第2个构造参数。
- cause:导致失败的异常。第3个构造参数。
(2)注册失败分析器
通过META-INF/spring.factories文件中注册失败分析器,这个文件是专门用来做注册的,如:
org.springframework.boot.diagnostics.FailureAnalyzer=\
cn.ljh.boot.failureanalyze.myFailureAnalyze
【注意:】 当你的失败分析器配置错误时,Spring Boot不会报错,
Spring Boot将直接使用系统内置的失败分析器,而不是使用自定义的失败分析器。
第一步:自定义失败分析器的类
第二步:通过META-INF/spring.factories文件中注册失败分析器
测试:
启动项目的方式有很多中,原本已经用启动类启动项目了,再用maven的插件来启动项目,可以导致端口占用出错,看自己自定义的失败分析器能否有效。
自定义的失败分析器成功生效。