springboot解析自定義yml方式
springboot解析自定義yml
在實(shí)際項(xiàng)目開發(fā)中我們經(jīng)常需要用到一些自定義配置,并且希望單獨(dú)配置,方便維護(hù),現(xiàn)在介紹下方式:
方式一:手動加載
對于一些不變動的配置,寫死在項(xiàng)目中維護(hù),如下
然后在啟動類中加載該配置
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轉(zhuǎn)成siteuid-config.properties
方式二:集成springcloud config
集成springcloud config后,默認(rèn)根據(jù)應(yīng)用名加載,如果需要加載多配置,需要修改相關(guān)配置:
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文件詳解
獲取數(shù)據(jù)第三種方式
數(shù)據(jù)可能是一個對象形式, 不需要一個一個獲取, 定義一個對應(yīng)的類, 要求屬性與yml的數(shù)據(jù)的二級屬性名一樣, 使用springboot提供的注解@ConfigurationProperties,進(jìn)行屬性與yml數(shù)據(jù)的一一映射
多環(huán)境配置
三個環(huán)境:
- 開發(fā)環(huán)境: dev
- 測試環(huán)境: test
- 生產(chǎn)環(huán)境: prod
每個環(huán)境不同的配置,分開寫, 相同的配置集中.
yml多環(huán)境配置:
- 第一種方式:單個文件 application.yml的多環(huán)境配置
#全局配置文件: application.yml #共同的配置,寫在全局配置文件中 spring: application: name: demo4 profiles: active: prod ? #激活某個環(huán)境: 使用那個環(huán)境 ? ? --- # 某個環(huán)境的配置文件 #給環(huán)境取名字 開發(fā)環(huán)境: dev spring: profiles: dev #環(huán)境的配置 server: port: 8080 ? --- # 某個環(huán)境的配置文件 #測試環(huán)境 test spring: profiles: test server: port: 9090 ? --- # 某個環(huán)境的配置文件 #生產(chǎn)環(huán)境 prod pro spring: profiles: prod server: port: 80
注意: 在Springboot高版本中, 定義環(huán)境名的配置已過時
#低版本 spring: profiles: prod 在高版本變?yōu)? #高版本 spring: config: activate: ?on-profile: test
- 第二種方式:多個yml文件多環(huán)境配置
環(huán)境配置文件名: application-環(huán)境名.yml
Properties類型的配置文件多環(huán)境配置
多個properties文件多環(huán)境配置
日志打印
默認(rèn)情況下,Spring Boot會用Logback來記錄日志,并用INFO級別輸出到控制臺
logback,log4j,log4j2 都是同一個人開發(fā), log4j --> log4j2 --> logback(分布式日志)
設(shè)置日志輸出級別:
- 第一種方式:
# 開啟debug模式,輸出調(diào)試信息,常用于檢查系統(tǒng)運(yùn)行狀況, 自己的日志還是info級別 debug: true
- 第二種方式:
# 設(shè)置日志級別,root表示根節(jié)點(diǎn),即整體應(yīng)用日志級別 logging: ? ? level: ? ? ? ? root: debug
- 第三種方式: 推薦
#單獨(dú)控制某個包下的日志輸出級別 #設(shè)置整個項(xiàng)目日志輸出級別 logging: ? #設(shè)置一個組 ? group: ? ? demo4: com.fs ? level: ? ? root: info ? ? #com.fs包的日志輸出級別為debug ? ? demo4: debug
日志寫到控制臺, 在開發(fā)日志直接打印控制臺,但是,測試,生產(chǎn)環(huán)境, 日志 保存到日志文件中
第一種方式: 所有的日志保存到一個日志文件:
logging: ? ? file: ? ? ? ? #保存當(dāng)前項(xiàng)目下 ? ? ? ? name: suke.log
問題:
- 日志內(nèi)容大, 打開很慢, 寫也慢
- 不方便查找某一天的日志
- 日志無法歸檔
第二種方式: 每一天產(chǎn)生一個日志文件, 限制每個日志文件大小, 超出,新創(chuàng)建一個文件
對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,比如: 如果設(shè)置為WARN,則低于WARN的信息都不會輸出 --> <!-- scan:當(dāng)此屬性設(shè)置為true時,配置文檔如果發(fā)生改變,將會被重新加載,默認(rèn)值為true --> <!-- scanPeriod:設(shè)置監(jiān)測配置文檔是否有修改的時間間隔,如果沒有給出時間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時,此屬性生效。默認(rèn)的時間間隔為1分鐘。 --> <!-- debug:當(dāng)此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息,實(shí)時查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。 --> <configuration scan="true" scanPeriod="10 seconds" debug="false"> <!-- 日志路徑 部署在服務(wù)器 文件夾需要設(shè)計(jì)777權(quán)限 ? linux服務(wù)器: 根目錄: / ? ?設(shè)置目錄訪問權(quán)限 ? 目錄不存在,創(chuàng)建目錄 --> <property name="log.base" value="C://logs/suke"/> <!--日志存儲天數(shù)--> <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> ? ?<!-- 滾動記錄文件,先將日志記錄到指定文件,當(dāng)符合某個條件時,將日志記錄到其他文件。--> ? ?<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> ? ? ? ?<!--按天回滾--> ? ? ? ?<fileNamePattern>${log.base}/info/archive/info_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> ? ? ? ?<!--日志最大存儲天數(shù)--> ? ? ? ?<maxHistory>${log.max.days}</maxHistory> ? ? ? ?<!--當(dāng)天的日志 超過大小 壓縮日志并保存 --> ? ? ? ?<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> ? ?<!-- 滾動記錄文件,先將日志記錄到指定文件,當(dāng)符合某個條件時,將日志記錄到其他文件。--> ? ?<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> ? ? ? ?<fileNamePattern>${log.base}/warn/archive/warn_%d{yyyy-MM-dd}.%i.log.zip ? ? ? ?</fileNamePattern> ? ? ? ?<!--日志最大存儲天數(shù)--> ? ? ? ?<maxHistory>${log.max.days}</maxHistory> ? ? ? ?<!-- 當(dāng)天的日志 超過大小 壓縮日志并保存 --> ? ? ? ?<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> ? ?<!-- 滾動記錄文件,先將日志記錄到指定文件,當(dāng)符合某個條件時,將日志記錄到其他文件。--> ? ?<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> ? ? ? ?<fileNamePattern>${log.base}/error/archive/error_%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> ? ? ? ?<!--日志最大存儲天數(shù)--> ? ? ? ?<maxHistory>${log.max.days}</maxHistory> ? ? ? ?<!-- 當(dāng)天的日志 超過大小 壓縮日志并保存 --> ? ? ? ?<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”的日志信息交給已經(jīng)配置好的名為“Console”的appender處理,“Console”appender將信息打印到Console --> <root level="info"> ? ?<appender-ref ref="stdout" /> <!-- 標(biāo)識這個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默認(rèn)會加載classpath:logback-spring.xml或者classpath:logback-spring.groovy或者:classpath:logback.xml
過濾器與攔截器的配置
過濾器配置:
第一種方式: 使用web3.0的注解方式: @WebFilter, javaWeb學(xué)習(xí)的
需要讓我們的springboot掃描這個注解, 以javaWeb的注解:
在啟動類, 使用@ServletComponentScan注解
第二種方式: 配置類
@SpringBootConfiguration public class JavaWebConfig { ? //配置過濾器 @Bean public FilterRegistrationBean<AFilter> configAFilter(){ FilterRegistrationBean<AFilter> filterFilterRegistrationBean = new FilterRegistrationBean<>(); //把過濾器對象設(shè)置給FilterRegistrationBean filterFilterRegistrationBean.setFilter(new AFilter()); //過濾器的配置 //設(shè)置過濾器攔截的url filterFilterRegistrationBean.addUrlPatterns("/*"); //設(shè)置過濾器名字 filterFilterRegistrationBean.setName("AFilter"); //設(shè)置過濾器的執(zhí)行順序 filterFilterRegistrationBean.setOrder(1); return filterFilterRegistrationBean; } }
攔截器的配置:
只能通過配置類進(jìn)行配置
攔截器是屬于SpringMVC的技術(shù), SpringBoot 對SpringMVC提供自動配置類,我們不能配置一個springMVC的配置類,替換我們自動配置類,
配置類實(shí)現(xiàn)WebMvcConfigurer接口
@SpringBootConfiguration public class MyWebMvcConfigretion implements WebMvcConfigurer { //配置攔截器 ? @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AInterceptor()).addPathPatterns("/**").excludePathPatterns("/testLog"); ? ? } }
全局異常處理器
基于AOP的異常增強(qiáng): @ControllerAdvice
步驟:
1.新建一個全局的異常類
2.在class上添加注解,@ControllerAdvice
3.在class中添加一個方法
4.在方法上添加@ExceptionHandler攔截相應(yīng)的異常
5.如果返回的是View ---方法的返回值是ModelAndView
6.如果返回的是String或者是JSON數(shù)據(jù),那么需要在方法上添加@ResponseBody注解
@ControllerAdvice //Controller的增強(qiáng)類 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(); }*/ }
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
javaweb中mysql數(shù)據(jù)庫連接步驟方法及其實(shí)例
這篇文章主要介紹了使用java web 連接MySQL數(shù)據(jù)庫的驅(qū)動方法的相關(guān)知識,本文介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下2017-04-04SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例
由于短鏈接可能涉及到用戶隱私和安全問題,所以短鏈接系統(tǒng)也需要符合相關(guān)的數(shù)據(jù)保護(hù)和安全標(biāo)準(zhǔn),本文主要介紹了SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例,感興趣的可以了解一下2023-09-09在Eclipse中運(yùn)行Solr 基礎(chǔ)知識
Solr我還是個菜鳥,寫這一些文章只是記錄一下最近一段時間學(xué)習(xí)Solr的心得,望各位同仁不要見笑,還希望多多指點(diǎn)2012-11-11MyBatis各種類型查詢數(shù)據(jù)參數(shù)綁定的實(shí)現(xiàn)
本文主要介紹了MyBatis各種類型查詢數(shù)據(jù)參數(shù)綁定的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06SpringBoot?2.7.18?集成?Mybatis?Plus?+?Druid的實(shí)例詳解
Mybatis和MybatisPlus都是流行的持久層框架,MybatisPlus在Mybatis基礎(chǔ)上增加了更多便捷的功能,如自動CRUD、分頁插件等,文章還提到了Entity、Mapper、Service、Controller等組件的基本使用方法,為開發(fā)者提供了一套完整的集成方案2024-10-10Java基于二維數(shù)組實(shí)現(xiàn)的數(shù)獨(dú)問題示例
這篇文章主要介紹了Java基于二維數(shù)組實(shí)現(xiàn)的數(shù)獨(dú)問題,涉及java針對數(shù)組的遍歷、計(jì)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01使用mongoTemplate實(shí)現(xiàn)多條件加分組查詢方式
這篇文章主要介紹了使用mongoTemplate實(shí)現(xiàn)多條件加分組查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06