java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > springboot解析自定义yml

springboot解析自定义yml方式

作者:lipengxs

这篇文章主要介绍了springboot解析自定义yml方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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数据的一一映射

多环境配置

三个环境:

每个环境不同的配置,分开写, 相同的配置集中.

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

环境配置文件名: 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();
    }*/
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文