springboot解析自定义yml方式
作者:lipengxs
springboot解析自定义yml
在实际项目开发中我们经常需要用到一些自定义配置,并且希望单独配置,方便维护,现在介绍下方式:
方式一:手动加载
对于一些不变动的配置,写死在项目中维护,如下
然后在启动类中加载该配置
public class AAApplication { public static void main(String[] args) { SpringApplication.run(RecommendApplication.class, args); } @Bean public static PropertySourcesPlaceholderConfigurer properties() { PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean(); yaml.setResources(new ClassPathResource("siteuid-config.yml")); configurer.setProperties(yaml.getObject()); return configurer; } }
注意:
如果是启动配置是properties文件,这里是无法加载yml,需要将配置的siteuid-config.yml转成siteuid-config.properties
方式二:集成springcloud config
集成springcloud config后,默认根据应用名加载,如果需要加载多配置,需要修改相关配置:
spring: application: name: quote profiles: active: dev cloud: config: profile: dev name: quote,siteuid-config enabled: true discovery: service-id: config-server enabled: true
springbootyml文件详解
获取数据第三种方式
数据可能是一个对象形式, 不需要一个一个获取, 定义一个对应的类, 要求属性与yml的数据的二级属性名一样, 使用springboot提供的注解@ConfigurationProperties,进行属性与yml数据的一一映射
多环境配置
三个环境:
- 开发环境: dev
- 测试环境: test
- 生产环境: prod
每个环境不同的配置,分开写, 相同的配置集中.
yml多环境配置:
- 第一种方式:单个文件 application.yml的多环境配置
#全局配置文件: application.yml #共同的配置,写在全局配置文件中 spring: application: name: demo4 profiles: active: prod #激活某个环境: 使用那个环境 --- # 某个环境的配置文件 #给环境取名字 开发环境: dev spring: profiles: dev #环境的配置 server: port: 8080 --- # 某个环境的配置文件 #测试环境 test spring: profiles: test server: port: 9090 --- # 某个环境的配置文件 #生产环境 prod pro spring: profiles: prod server: port: 80
注意: 在Springboot高版本中, 定义环境名的配置已过时
#低版本 spring: profiles: prod 在高版本变为: #高版本 spring: config: activate: on-profile: test
- 第二种方式:多个yml文件多环境配置
环境配置文件名: application-环境名.yml
Properties类型的配置文件多环境配置
多个properties文件多环境配置
日志打印
默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台
logback,log4j,log4j2 都是同一个人开发, log4j --> log4j2 --> logback(分布式日志)
设置日志输出级别:
- 第一种方式:
# 开启debug模式,输出调试信息,常用于检查系统运行状况, 自己的日志还是info级别 debug: true
- 第二种方式:
# 设置日志级别,root表示根节点,即整体应用日志级别 logging: level: root: debug
- 第三种方式: 推荐
#单独控制某个包下的日志输出级别 #设置整个项目日志输出级别 logging: #设置一个组 group: demo4: com.fs level: root: info #com.fs包的日志输出级别为debug demo4: debug
日志写到控制台, 在开发日志直接打印控制台,但是,测试,生产环境, 日志 保存到日志文件中
第一种方式: 所有的日志保存到一个日志文件:
logging: file: #保存当前项目下 name: suke.log
问题:
- 日志内容大, 打开很慢, 写也慢
- 不方便查找某一天的日志
- 日志无法归档
第二种方式: 每一天产生一个日志文件, 限制每个日志文件大小, 超出,新创建一个文件
对Logback日志专门编写一个配置文件, logback-自定义名.xml 推荐使用名
除了: logback-logback.xml
对Logback日志专门编写一个配置文件, logback-自定义名.xml 推荐使用名
除了: logback-logback.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true --> <!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <configuration scan="true" scanPeriod="10 seconds" debug="false"> <!-- 日志路径 部署在服务器 文件夹需要设计777权限 linux服务器: 根目录: / 设置目录访问权限 目录不存在,创建目录 --> <property name="log.base" value="C://logs/suke"/> <!--日志存储天数--> <property name="log.max.days" value="30"/> <!-- 日志文件大小 --> <property name="log.max.size" value="500MB"/> <!-- 输出格式--> <property name="log.pattern" value="%date{ISO8601} %level [%thread] %logger{56} : %msg%n"/> <!--字符集--> <property name="log.charset" value="UTF-8"/> <!--控制台-附加器 --> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <!--格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${log.pattern}</pattern> <charset>${log.charset}</charset> </encoder> </appender> <!--info-附加器--> <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.base}/info/_info.log</file><!--存储路径--> <!-- 输出格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${log.pattern}</pattern> <charset>${log.charset}</charset> </encoder> <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。--> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--按天回滚--> <fileNamePattern>${log.base}/info/archive/info_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> <!--日志最大存储天数--> <maxHistory>${log.max.days}</maxHistory> <!--当天的日志 超过大小 压缩日志并保存 --> <maxFileSize>${log.max.size}</maxFileSize> </rollingPolicy> <!--过滤器,只记录INFO级别的日志--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!--warn-附加器--> <appender name="warnFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.base}/warn/_warn.log</file><!--存储路径--> <!--输出格式--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${log.pattern}</pattern> <charset>${log.charset}</charset> </encoder> <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。--> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.base}/warn/archive/warn_%d{yyyy-MM-dd}.%i.log.zip </fileNamePattern> <!--日志最大存储天数--> <maxHistory>${log.max.days}</maxHistory> <!-- 当天的日志 超过大小 压缩日志并保存 --> <maxFileSize>${log.max.size}</maxFileSize> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!--error-附加器--> <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.base}/error/_error.log</file><!--存储路径 --> <!--输出格式--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${log.pattern}</pattern> <charset>${log.charset}</charset> </encoder> <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。--> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.base}/error/archive/error_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> <!--日志最大存储天数--> <maxHistory>${log.max.days}</maxHistory> <!-- 当天的日志 超过大小 压缩日志并保存 --> <maxFileSize>${log.max.size}</maxFileSize> </rollingPolicy> <!--级别-过滤器 error--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName --> <!--<logger name="org.springframework.aop.framework.CglibAopProxy" additivity="false"> <level value="info" /> <appender-ref ref="stdout" /> </logger>--> <logger name="com.fs" additivity="false"> <level value="debug" /> <appender-ref ref="stdout" /> <!--<appender-ref ref="infoFile" />--> </logger> <!-- root将级别为“DEBUG”及大于“DEBUG”的日志信息交给已经配置好的名为“Console”的appender处理,“Console”appender将信息打印到Console --> <root level="info"> <appender-ref ref="stdout" /> <!-- 标识这个appender将会添加到这个logger --> <appender-ref ref="infoFile" /> <appender-ref ref="warnFile" /> <appender-ref ref="errorFile" /> </root> </configuration>
在application.yml文件中指定logback的配置文件
#指定logback的配置文件 logging: config: classpath:logback-demo4.xml
注意:
spring boot默认会加载classpath:logback-spring.xml或者classpath:logback-spring.groovy或者:classpath:logback.xml
过滤器与拦截器的配置
过滤器配置:
第一种方式: 使用web3.0的注解方式: @WebFilter, javaWeb学习的
需要让我们的springboot扫描这个注解, 以javaWeb的注解:
在启动类, 使用@ServletComponentScan注解
第二种方式: 配置类
@SpringBootConfiguration public class JavaWebConfig { //配置过滤器 @Bean public FilterRegistrationBean<AFilter> configAFilter(){ FilterRegistrationBean<AFilter> filterFilterRegistrationBean = new FilterRegistrationBean<>(); //把过滤器对象设置给FilterRegistrationBean filterFilterRegistrationBean.setFilter(new AFilter()); //过滤器的配置 //设置过滤器拦截的url filterFilterRegistrationBean.addUrlPatterns("/*"); //设置过滤器名字 filterFilterRegistrationBean.setName("AFilter"); //设置过滤器的执行顺序 filterFilterRegistrationBean.setOrder(1); return filterFilterRegistrationBean; } }
拦截器的配置:
只能通过配置类进行配置
拦截器是属于SpringMVC的技术, SpringBoot 对SpringMVC提供自动配置类,我们不能配置一个springMVC的配置类,替换我们自动配置类,
配置类实现WebMvcConfigurer接口
@SpringBootConfiguration public class MyWebMvcConfigretion implements WebMvcConfigurer { //配置拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AInterceptor()).addPathPatterns("/**").excludePathPatterns("/testLog"); } }
全局异常处理器
基于AOP的异常增强: @ControllerAdvice
步骤:
1.新建一个全局的异常类
2.在class上添加注解,@ControllerAdvice
3.在class中添加一个方法
4.在方法上添加@ExceptionHandler拦截相应的异常
5.如果返回的是View ---方法的返回值是ModelAndView
6.如果返回的是String或者是JSON数据,那么需要在方法上添加@ResponseBody注解
@ControllerAdvice //Controller的增强类 public class GlobalDefaultExceptionHandler { //这个方法处理Controller[抛出所有的异常类型 @ExceptionHandler(Exception.class) public String handleException1(Exception ex){ return ex.getMessage(); } /* @ExceptionHandler(RuntimeException.class) public String handleException2(Exception ex){ return ex.getMessage(); }*/ }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。