1. 常用注解
SpringBoot摒棄XML配置方式,改為全注解驅動
1. 組件注冊
@Configuration
、@SpringBootConfiguration
@Bean
、@Scope
@Controller
、@Service
、@Repository
、@Component
@Import
@ComponentScan
步驟:
1、@Configuration 編寫一個配置類
2、在配置類中,自定義方法給容器中注冊組件。配合@Bean
3、或使用@Import 導入第三方的組件
2. 條件注解
如果注解指定的條件成立,則觸發(fā)指定行為
@ConditionalOnXxx
@ConditionalOnClass
:如果類路徑中存在這個類,則觸發(fā)指定行為@ConditionalOnMissingClass
:如果類路徑中不存在這個類,則觸發(fā)指定行為@ConditionalOnBean
:如果容器中存在這個Bean(組件),則觸發(fā)指定行為@ConditionalOnMissingBean
:如果容器中不存在這個Bean(組件),則觸發(fā)指定行為
例如:@ConditionalOnBean(value=組件類型,name=組件名字)
:判斷容器中是否有這個類型的組件,并且名字是指定的值
@ConditionalOnRepositoryType
(org.springframework.boot.autoconfigure.data)@ConditionalOnDefaultWebSecurity
(org.springframework.boot.autoconfigure.security)@ConditionalOnSingleCandidate
(org.springframework.boot.autoconfigure.condition)@ConditionalOnWebApplication
(org.springframework.boot.autoconfigure.condition)@ConditionalOnWarDeployment
(org.springframework.boot.autoconfigure.condition)@ConditionalOnJndi
(org.springframework.boot.autoconfigure.condition)@ConditionalOnResource
(org.springframework.boot.autoconfigure.condition)@ConditionalOnExpression
(org.springframework.boot.autoconfigure.condition)
@ConditionalOnClass (org.springframework.boot.autoconfigure.condition)@ConditionalOnEnabledResourceChain
(org.springframework.boot.autoconfigure.web)
@ConditionalOnMissingClass (org.springframework.boot.autoconfigure.condition)@ConditionalOnNotWebApplication
(org.springframework.boot.autoconfigure.condition)@ConditionalOnProperty
(org.springframework.boot.autoconfigure.condition)@ConditionalOnCloudPlatform
(org.springframework.boot.autoconfigure.condition)
@ConditionalOnBean (org.springframework.boot.autoconfigure.condition)
@ConditionalOnMissingBean (org.springframework.boot.autoconfigure.condition)@ConditionalOnMissingFilterBean
(org.springframework.boot.autoconfigure.web.servlet)@Profile
(org.springframework.context.annotation)@ConditionalOnInitializedRestarter
(org.springframework.boot.devtools.restart)@ConditionalOnGraphQlSchema
(org.springframework.boot.autoconfigure.graphql)@ConditionalOnJava
(org.springframework.boot.autoconfigure.condition)
3. 屬性綁定
-
@ConfigurationProperties
: 聲明組件的屬性和配置文件哪些前綴開始項進行綁定 -
@EnableConfigurationProperties
:快速注冊注解:-
使用場景:SpringBoot默認只掃描自己主程序所在的包。如果導入第三方包,即使組件上標注了
@Component
、@ConfigurationProperties
注解,也沒用。因為組件都掃描不進來,此時使用這個注解就可以快速進行屬性綁定并把組件注冊進容器
-
使用場景:SpringBoot默認只掃描自己主程序所在的包。如果導入第三方包,即使組件上標注了
將容器中任意組件(Bean)的屬性值和配置文件的配置項的值進行綁定
- 1、給容器中注冊組件(
@Component
、@Bean
)- 2、使用
@ConfigurationProperties
聲明組件和配置文件的哪些配置項進行綁定
2. YAML配置文件
解決痛點:SpringBoot 集中化管理配置,application.properties
。配置多以后難閱讀和修改,層級結構辨識度不高
特點:
- 設計目標,就是方便人類讀寫
- 層次分明,更適合做配置文件
- 使用
.yaml
或.yml
作為文件后綴
1. 基本語法
- 大小寫敏感
- 使用縮進表示層級關系,k: v,使用空格分割k,v
- 縮進時不允許使用Tab鍵,只允許使用空格。換行
- 縮進的空格數(shù)目不重要,只要相同層級的元素左側對齊即可
- # 表示注釋,從這個字符一直到行尾,都會被解析器忽略。
支持的寫法:
- 對象:鍵值對的集合,如:映射(map)/ 哈希(hash) / 字典(dictionary)
- 數(shù)組:一組按次序排列的值,如:序列(sequence) / 列表(list)
- 純量:單個的、不可再分的值,如:字符串、數(shù)字、bool、日期
2. 示例
@Component
@ConfigurationProperties(prefix = "person") //和配置文件person前綴的所有配置進行綁定
@Data //自動生成JavaBean屬性的getter/setter
//@NoArgsConstructor //自動生成無參構造器
//@AllArgsConstructor //自動生成全參構造器
public class Person {
private String name;
private Integer age;
private Date birthDay;
private Boolean like;
private Child child; //嵌套對象
private List<Dog> dogs; //數(shù)組(里面是對象)
private Map<String,Cat> cats; //表示Map
}
@Data
public class Dog {
private String name;
private Integer age;
}
@Data
public class Child {
private String name;
private Integer age;
private Date birthDay;
private List<String> text; //數(shù)組
}
@Data
public class Cat {
private String name;
private Integer age;
}
properties表示法
person.name=張三
person.age=18
person.birthDay=2010/10/12 12:12:12
person.like=true
person.child.name=李四
person.child.age=12
person.child.birthDay=2018/10/12
person.child.text[0]=abc
person.child.text[1]=def
person.dogs[0].name=小黑
person.dogs[0].age=3
person.dogs[1].name=小白
person.dogs[1].age=2
person.cats.c1.name=小藍
person.cats.c1.age=3
person.cats.c2.name=小灰
person.cats.c2.age=2
yaml表示法
person:
name: 張三
age: 18
birthDay: 2010/10/10 12:12:12
like: true
child:
name: 李四
age: 20
birthDay: 2018/10/10
text: ["abc","def"]
dogs:
- name: 小黑
age: 3
- name: 小白
age: 2
cats:
c1:
name: 小藍
age: 3
c2: {name: 小綠,age: 2} #對象也可用{}表示
3. 細節(jié)
- birthDay 推薦寫為 birth-day,用
-
來表示駝峰命名 -
文本:
- 單引號不會轉義【\n 則為普通字符串顯示】
- 雙引號會轉義【\n會顯示為換行符】
-
大文本
-
|
開頭,大文本寫在下層,保留文本格式,換行符正確顯示 -
>
開頭,大文本寫在下層,折疊換行符
-
-
多文檔合并
- 使用
---
可以把多個yaml文檔合并在一個文檔中,每個文檔區(qū)依然認為內容獨立 -
多配置文件:文件名可以是
application-{profile}.properties/yml
,用來指定多個不同的環(huán)境版本;默認使用application
主配置文件,通過spring.profiles.active=dev
激活指定的配置文件
- 使用
4. 小技巧:lombok
簡化JavaBean 開發(fā)。自動生成構造器、getter/setter、自動生成Builder模式等
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!--compile:默認范圍,編譯測試運行都有效 -->
<scope>compile</scope>
</dependency>
3. 日志配置
1. 簡介
- Spring使用
commons-logging
作為內部日志,但底層日志實現(xiàn)是開放的??蓪悠渌罩究蚣?。 - 支持
jul
,log4j2
,logback
。SpringBoot 提供了默認的控制臺輸出配置,也可以配置輸出為文件。 -
logback
是默認使用的。 - 雖然日志框架很多,但是不用慌,使用 SpringBoot 的默認配置就能工作的很好。
SpringBoot怎么把日志默認配置好的:
- 1、每個starter場景,都會導入一個核心場景
spring-boot-starter
- 2、核心場景引入了日志的所用功能
spring-boot-starter-logging
- 3、默認使用了
logback
+slf4j
組合作為默認底層日志 - 4、日志是系統(tǒng)一啟動就要用,
xxxAutoConfiguration
是系統(tǒng)啟動好了以后放好的組件,后來用的。 - 5、日志是利用監(jiān)聽器機制配置好的。
ApplicationListener
。 - 6、日志所有的配置都可以通過修改配置文件實現(xiàn)。以
logging
開始的所有配置。
2. 日志格式
2023-06-07T22:18:12.568+08:00 INFO 7700 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2023-06-07T22:18:12.569+08:00 INFO 7700 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
默認輸出格式:
- 時間和日期:毫秒級精度
- 日志級別:
ERROR
,WARN
,INFO
,DEBUG
, orTRACE
. - 進程 ID
- —: 消息分割符
- 線程名: 使用[]包含
- Logger 名: 通常是產(chǎn)生日志的類名
- 消息: 日志記錄的內容
注意: logback 沒有FATAL
級別,對應的是ERROR
默認值:參照:spring-boot包additional-spring-configuration-metadata.json
文件
默認輸出格式值:"defaultValue": "%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"
以上配置使用的SpringBoot版本是:3.0.5
3. 記錄日志
Logger logger = LoggerFactory.getLogger(getClass());
#或者使用Lombok的@Slf4j注解
4. 日志級別
-
由低到高:
ALL
<TRACE
<DEBUG
<INFO
<WARN
<ERROR
<FATAL
<OFF
;- 只會打印指定級別及以上級別的日志
-
ALL
:打印所有日志 -
TRACE
:追蹤框架詳細流程日志,一般不使用 -
DEBUG
:開發(fā)調試細節(jié)日志 -
INFO
:關鍵、感興趣信息日志 -
WARN
:警告但不是錯誤的信息日志,比如:版本過時 -
ERROR
:業(yè)務錯誤日志,比如出現(xiàn)各種異常 -
FATAL
:致命錯誤日志,比如jvm系統(tǒng)崩潰 -
OFF
:關閉所有日志記錄
-
不指定級別的所有類,都使用root指定的級別作為默認級別
-
SpringBoot日志默認級別是 INFO
- 在
application.properties/yaml
中配置logging.level.<logger-name>=<level>
指定日志級別 -
level
可取值范圍:TRACE
,DEBUG
,INFO
,WARN
,ERROR
,FATAL
orOFF
,定義在 LogLevel類中 - root 的
logger-name
叫root
,可以配置logging.level.root=warn
,代表所有未指定日志級別都使用 root 的warn
級別
5. 日志分組
比較有用的技巧是:
將相關的logger
分組在一起,統(tǒng)一配置。SpringBoot 也支持。比如:Tomcat 相關的日志統(tǒng)一設置
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.level.tomcat=trace
SpringBoot 預定義的兩個組:
Name | Loggers |
---|---|
web |
org.springframework.core.codec, org.springframework.http , org.springframework.web, org.springframework.boot.actuate.endpoint.web , org.springframework.boot.web.servlet.ServletContextInitializerBeans
|
sql | org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener |
6. 文件輸出
SpringBoot 默認只把日志寫在控制臺,如果想額外記錄到文件,可以在application.properties
中添加logging.file.name
or logging.file.path
配置項。也可以直接在日志配置文件中直接指定
常用的logback-spring.xml
模板:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1000 seconds">
<springProperty scope="context" name="spring.application.name" source="spring.application.name" defaultValue="app"/>
<timestamp key="date" datePattern="yyyyMMdd"/>
<property name="colorfulPattern"
value="%blue(%d{MM-dd HH:mm:ss}) [%boldYellow(%thread)] | %highlight(%-5level) | %boldGreen(%logger) %X{clientIp} %X{operateId} - %highlight(%msg) %n"/>
<property name="defaultPattern"
value="%d{MM-dd HH:mm:ss} [%thread] | %-5level | %logger %X{clientIp} %X{operateId} - %msg %n"/>
<property name="log.base_path" value="E:\data\logs"/>
<!-- 日志文件大小,超過這個大小將被壓縮 -->
<property name="log.max.size" value="100MB"/>
<!--控制臺輸出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${colorfulPattern}</pattern>
<!-- <pattern>${defaultPattern}</pattern>-->
</encoder>
</appender>
<appender name="trace.appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base_path}/${spring.application.name}/trace.${spring.application.name}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
${log.base_path}/archive/${spring.application.name}/trace.${spring.application.name}.%d{yyyyMMdd}.%i.log.zip
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.max.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${defaultPattern}</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="info.appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base_path}/${spring.application.name}/info.${spring.application.name}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
${log.base_path}/archive/${spring.application.name}/info.${spring.application.name}.%d{yyyyMMdd}.%i.log.zip
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.max.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${defaultPattern}</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="debug.appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base_path}/${spring.application.name}/debug.${spring.application.name}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
${log.base_path}/archive/${spring.application.name}/debug.${spring.application.name}.%d{yyyyMMdd}.%i.log.zip
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.max.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${defaultPattern}</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="error.appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base_path}/${spring.application.name}/error.${spring.application.name}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
${log.base_path}/archive/${spring.application.name}/error.${spring.application.name}.%d{yyyyMMdd}.%i.log.zip
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.max.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${defaultPattern}</pattern>
</layout>
<!-- 下面為配置只輸出error級別的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 -->
<!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
<!-- 添加附加的appender,最多只能添加一個 -->
<appender name="trace.async" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>256</queueSize>
<includeCallerData>true</includeCallerData>
<appender-ref ref="trace.appender"/>
</appender>
<!-- http rest 請求日志 -->
<logger name="cn.felord.common.http.RestBodyAdvice" level="TRACE"/>
<logger name="cn.felord.app.mapper" level="DEBUG"/>
<!-- dev 環(huán)境調試 -->
<springProfile name="dev">
<logger name="org.springframework.security" level="TRACE" additivity="false" >
<appender-ref ref="stdout"/>
</logger>
<logger name="org.springframework.security.oauth2" level="DEBUG" additivity="false" >
<appender-ref ref="stdout"/>
</logger>
<logger name="org.springframework.web" level="TRACE" additivity="false" >
<appender-ref ref="stdout"/>
</logger>
</springProfile>
<root level="info">
<appender-ref ref="stdout"/>
<appender-ref ref="info.appender"/>
<appender-ref ref="debug.appender"/>
<appender-ref ref="error.appender"/>
<appender-ref ref="trace.async"/>
</root>
</configuration>
7. 文件歸檔與滾動切割
歸檔:每天的日志單獨存到一個文檔中。
切割:每個文件10MB,超過大小切割成另外一個文件。
- 每天的日志應該獨立分割出來存檔。如果使用
logback
(SpringBoot 默認整合),可以通過application.properties/yaml
文件指定日志滾動規(guī)則。 - 如果是其他日志系統(tǒng),需要自行配置(添加
log4j2.xml
或log4j2-spring.xml
) - 支持的滾動規(guī)則設置如下
配置項 | 描述 |
---|---|
logging.logback.rollingpolicy.file-name-pattern |
日志存檔的文件名格式(默認值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz ) |
logging.logback.rollingpolicy.clean-history-on-start |
應用啟動時是否清除以前存檔(默認值:false ) |
logging.logback.rollingpolicy.max-file-size |
存檔前,每個日志文件的最大大?。J值:10MB ) |
logging.logback.rollingpolicy.total-size-cap |
日志文件被刪除之前,可以容納的最大大?。J值:0B )。設置1GB則磁盤存儲超過 1GB 日志后就會刪除舊日志文件 |
logging.logback.rollingpolicy.max-history |
日志文件保存的最大天數(shù)(默認值:7 ) |
8. 自定義配置
通常配置 application.properties
就夠了。當然也可以自定義。比如:
日志系統(tǒng) | 日志系統(tǒng) 自定義 |
---|---|
Logback |
logback-spring.xml , logback-spring.groovy , logback.xml , or logback.groovy
|
Log4j2 |
log4j2-spring.xml or log4j2.xml
|
JDK (Java Util Logging) | logging.properties |
最佳工作實踐:自己要寫日志配置文件,配置文件名加上 xx-spring.xml
文章來源:http://www.zghlxwxcb.cn/news/detail-510143.html
9. 切換日志組合
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
log4j2支持XML、JSON、YAML和properties四種配置文件格式文章來源地址http://www.zghlxwxcb.cn/news/detail-510143.html
10. 工作實踐
- 導入任何第三方框架,先排除它的日志包,因為SpringBoot底層控制好了日志
- 修改
application.properties
配置文件,就可以調整日志的所有行為。如果不夠,可以編寫日志框架自己的配置文件放在類路徑下就行,比如logback-spring.xml
,log4j2-spring.xml
- 如需對接專業(yè)日志系統(tǒng),也只需要把 logback 記錄的日志灌倒
kafka
之類的中間件,這和SpringBoot沒關系,都是日志框架自己的配置,修改配置文件即可 - 業(yè)務中使用
slf4j-api
記錄日志。不要再System.out.println()
了
到了這里,關于SpringBoot3中的屬性綁定注解和YMAL配置文件、日志的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!