SpringBoot3零基礎(chǔ)教程-快速入門筆記
前置準(zhǔn)備
- Jdk17環(huán)境
- idea 2021.2.1+才支持Java17
- Springboot 3.0.5+
開發(fā)百科書
Jdk17安裝
- homebrew官網(wǎng)沸手,神器
使用homebrew安裝jdk17,安裝完成后在idea就可以選擇jdk17版本了嚼贡。
#先搜索 openjdk版本
brew search openjdk
#查看要按照的版本詳情
brew info openjdk@17
#安裝
brew install openjdk@17
#注意,如果是內(nèi)網(wǎng)搜索不到就選擇安裝其他版本的叁执,或者從官網(wǎng)下載
#我們可以先在homebrew官網(wǎng)搜索openjdk
#安裝完成后如果本地有jdk8等其他版本篙悯,還要執(zhí)行jdk17環(huán)境切換命令
sudo ln -sfn $HOMEBREW_PREFIX/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk
#切換jdk8
sudo ln -sfn $HOMEBREW_PREFIX/opt/openjdk@8/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-8.jdk
Springboot3核心特性
快速入門
Springboot特性
-
springboot只需要打成jar包单匣,服務(wù)器有java環(huán)境就可以運行夕凝。
- java -jar
-
使用各種場景啟動器starter進(jìn)行應(yīng)用整合宝穗,不再需要導(dǎo)包。
- starter使用maven依賴直接幫我們把需要依賴的jar包引用進(jìn)來码秉。
-
自動配置
- 約定大于配置
- 場景自帶默認(rèn)配置逮矛,需要自定義再在配置文件中修改即可。
提供生產(chǎn)級特性转砖,如:監(jiān)控指標(biāo)须鼎,健康檢查(k8s),外部化配置(配置文件放在外部府蔗,重啟后即可生效晋控,不需要再打jar包)等。
簡化開發(fā)礁竞,無需編寫任何配置,就可以直接開發(fā)業(yè)務(wù)
簡化集中管理配置杉辙,配置文件收斂為一個
application.yml
,不像以前ssm要配置多個模捂,spirng有一個,springmvc一個蜘矢,mybatisy一個等等狂男。
Demo
所有springboot項目都必須繼承自pring-boot-starter-parent,因為springboot需要這個parent完成默認(rèn)初始化依賴品腹。
-
創(chuàng)建一個springboot啟動起來最簡單的2個步驟:
- 引入依賴parent,starter-web
- 編寫啟動類
-
之后這樣就可以寫Controller業(yè)務(wù)代碼了
@RestController就是@Controller和@ResponseBody的合體
項目打jar包: mvn clean package
啟動部署:執(zhí)行
java -jar hellodemo-0.0.1-SNAPSHOT.jar
命令即可-
外部化配置處理岖食。在jar包所在文件夾添加
application.properties
配置文件,修改配置,重新啟動修改的配置就能生效舞吭。- 注意泡垃,測試或生產(chǎn)上要避免這種處理的情況,避免不易排查問題羡鸥。
-
- 官方提供的場景:命名為:
spring-boot-starter-*
- 第三方提供場景:命名為:
*-spring-boot-starter
- 官方提供的場景:命名為:
引入依賴
<!-- 所有springboot項目都必須繼承自pring-boot-starter-parent -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.5</version>
</parent>
<!-- web開發(fā)場景啟動器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot官方提供的應(yīng)用打包插件蔑穴,引用后就可以執(zhí)行clean,install等命令-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
編寫啟動類
//@SpringBootApplication標(biāo)識這是個springboot應(yīng)用
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HellomotoApplication.class, args);
}
}
業(yè)務(wù)類HelloController
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
System.out.println("-------------hello-----------------");
return "hello world";
}
}
idea打開展示被排除的文件
Spring Initializr 創(chuàng)建向?qū)?/h3>
- 一鍵創(chuàng)建好springboot項目
1.依賴管理機(jī)制
1惧浴、為什么導(dǎo)入starter-web
所有相關(guān)依賴都導(dǎo)入進(jìn)來存和?
- 開發(fā)什么場景,導(dǎo)入什么場景啟動器衷旅。
- maven依賴傳遞原則捐腿。A-B-C: A就擁有B和C
- 導(dǎo)入 場景啟動器。 場景啟動器自動把這個場景的所有核心依賴全部導(dǎo)入進(jìn)來
2柿顶、為什么版本號都不用寫茄袖?
- 每個boot項目都有一個父項目
spring-boot-starter-parent
- parent的父項目是
spring-boot-dependencies
- 父項目 版本仲裁中心,把所有常見的jar的依賴版本都聲明好了嘁锯。
- 比如:
mysql-connector-j
3绞佩、自定義版本號
利用maven的就近原則
- 直接在當(dāng)前項目
properties
標(biāo)簽中聲明父項目用的版本屬性的key寺鸥,去spring-boot-dependencies
上查看對應(yīng)的key值修改。key必須一樣的品山。 - 直接在導(dǎo)入依賴的時候聲明版本
- 直接在當(dāng)前項目
4胆建、引用第三方的jar包
- boot父項目沒有管理的需要自行聲明好,包括引用的版本.如下:
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
2.自動配置機(jī)制
- 總結(jié): 導(dǎo)入場景啟動器肘交、觸發(fā)
spring-boot-autoconfigure
這個包的自動配置生效笆载、容器中就會具有相關(guān)場景的功能。
1. 初步理解
自動配置的 Tomcat涯呻、SpringMVC 等
- 導(dǎo)入場景凉驻,容器中就會自動配置好這個場景的核心組件。
- 以前:DispatcherServlet复罐、ViewResolver涝登、CharacterEncodingFilter....
- 現(xiàn)在:自動配置好的這些組件
- 驗證:容器中有了什么組件,就具有什么功能
public static void main(String[] args) {
//java10: 局部變量類型的自動推斷
var ioc = SpringApplication.run(MainApplication.class, args);
//1效诅、獲取容器中所有組件的名字
String[] names = ioc.getBeanDefinitionNames();
//2胀滚、挨個遍歷:
// dispatcherServlet、beanNameViewResolver乱投、characterEncodingFilter咽笼、multipartResolver
// SpringBoot把以前配置的核心組件現(xiàn)在都給我們自動配置好了。
for (String name : names) {
System.out.println(name);
}
}
默認(rèn)的包掃描規(guī)則
-
@SpringBootApplication
標(biāo)注的類就是主程序類 - SpringBoot只會掃描主程序所在的包及其下面的子包戚炫,自動的component-scan功能
- 自定義掃描路徑
-
- @SpringBootApplication(scanBasePackages = "com.atguigu")
-
@ComponentScan("com.atguigu")
直接指定掃描的路徑
配置默認(rèn)值
- 配置文件的所有配置項是和某個類的對象值進(jìn)行一一綁定的剑刑。
- 綁定了配置文件中每一項值的類: 屬性類。
- 比如:
-
ServerProperties
綁定了所有Tomcat服務(wù)器有關(guān)的配置 -
MultipartProperties
綁定了所有文件上傳相關(guān)的配置 - ....參照官方文檔:或者參照 綁定的 屬性類双肤。
-
按需加載自動配置
- 比如導(dǎo)入場景
spring-boot-starter-web
- 場景啟動器除了會導(dǎo)入相關(guān)功能依賴施掏,導(dǎo)入一個
spring-boot-starter
,是所有starter
的starter
茅糜,基礎(chǔ)核心starter -
spring-boot-starter
導(dǎo)入了一個包spring-boot-autoconfigure
其监。包里面都是各種場景的AutoConfiguration
自動配置類 - 雖然全場景的自動配置都在
spring-boot-autoconfigure
這個包,但是不是全都開啟的限匣。
- 比如導(dǎo)入場景
- 導(dǎo)入哪個場景就開啟哪個自動配置
細(xì)節(jié)圖
2. 自動配置完整流程
思考:
1抖苦、SpringBoot怎么實現(xiàn)導(dǎo)一個**starter**
、寫一些簡單配置米死,應(yīng)用就能跑起來锌历,我們無需關(guān)心整合
2、為什么Tomcat的端口號可以配置在application.properties
中峦筒,并且Tomcat
能啟動成功究西?
3、導(dǎo)入場景后哪些自動配置能生效物喷?
[圖片上傳失敗...(image-427a8b-1723480665629)]
自動配置流程細(xì)節(jié)梳理:
1卤材、導(dǎo)入starter-web
:導(dǎo)入了web開發(fā)場景
- 1遮斥、場景啟動器導(dǎo)入了相關(guān)場景的所有依賴:
starter-json
、starter-tomcat
扇丛、springmvc
- 2术吗、每個場景啟動器都引入了一個
spring-boot-starter
,核心場景啟動器帆精。 - 3较屿、核心場景啟動器引入了
spring-boot-autoconfigure
包。 - 4卓练、
spring-boot-autoconfigure
里面囊括了所有場景的所有配置隘蝎。 - 5、只要這個包下的所有類都能生效襟企,那么相當(dāng)于SpringBoot官方寫好的整合功能就生效了嘱么。
- 6、SpringBoot默認(rèn)卻掃描不到
spring-boot-autoconfigure
下寫好的所有配置類顽悼。(這些配置類給我們做了整合操作)曼振,默認(rèn)只掃描主程序所在的包。
2表蝙、主程序:@SpringBootApplication
1拴测、
@SpringBootApplication
由三個注解組成@SpringBootConfiguration
乓旗、@EnableAutoConfiguratio
府蛇、@ComponentScan
2、SpringBoot默認(rèn)只能掃描自己主程序所在的包及其下面的子包屿愚,掃描不到
spring-boot-autoconfigure
包中官方寫好的配置類3汇跨、
**@EnableAutoConfiguration**
:SpringBoot 開啟自動配置的核心。- \1. 是由
@Import(AutoConfigurationImportSelector.class)
提供功能:批量給容器中導(dǎo)入組件妆距。 - \2. SpringBoot啟動會默認(rèn)加載 142個配置類穷遂。
- \3. 這142個配置類來自于
spring-boot-autoconfigure
下META-INF/spring/**org.springframework.boot.autoconfigure.AutoConfiguration**.imports
文件指定的 - 項目啟動的時候利用 @Import 批量導(dǎo)入組件機(jī)制把
autoconfigure
包下的142xxxxAutoConfiguration
類導(dǎo)入進(jìn)來(自動配置類) - 雖然導(dǎo)入了
142
個自動配置類
- \1. 是由
4、按需生效:
- 并不是這
142
個自動配置類都能生效 - 每一個自動配置類娱据,都有條件注解
@ConditionalOnxxx
蚪黑,只有條件成立,才能生效
- 并不是這
3中剩、**xxxxAutoConfiguration**
自動配置類
- 1忌穿、給容器中使用@Bean 放一堆組件。
- 2结啼、每個自動配置類都可能有這個注解
@EnableConfigurationProperties(**ServerProperties**.class)
掠剑,用來把配置文件中配的指定前綴的屬性值封裝到xxxProperties
屬性類中 - 3、以Tomcat為例:把服務(wù)器的所有配置都是以
server
開頭的郊愧。配置都封裝到了屬性類中朴译。 - 4井佑、給容器中放的所有組件的一些核心參數(shù),都來自于
**xxxProperties**
眠寿。**xxxProperties**
都是和配置文件綁定躬翁。 - 只需要改配置文件的值,核心組件的底層參數(shù)都能修改
4澜公、寫業(yè)務(wù)姆另,全程無需關(guān)心各種整合(底層這些整合寫好了,而且也生效了)
核心流程總結(jié):
1坟乾、導(dǎo)入starter
迹辐,就會導(dǎo)入autoconfigure
包。
2甚侣、autoconfigure
包里面 有一個文件 META-INF/spring/**org.springframework.boot.autoconfigure.AutoConfiguration**.imports
,里面指定的所有啟動要加載的自動配置類
3明吩、@EnableAutoConfiguration 會自動的把上面文件里面寫的所有自動配置類都導(dǎo)入進(jìn)來。xxxAutoConfiguration 是有條件注解進(jìn)行按需加載
4殷费、xxxAutoConfiguration
給容器中導(dǎo)入一堆組件印荔,組件都是從 xxxProperties
中提取屬性值
5、xxxProperties
又是和配置文件進(jìn)行了綁定
效果:導(dǎo)入starter
详羡、修改配置文件仍律,就能修改底層行為。
3. 如何學(xué)好SpringBoot——使用一般流程
框架的框架实柠、底層基于Spring水泉。能調(diào)整每一個場景的底層行為。100%項目一定會用到底層自定義
攝影:
- 傻瓜:自動配置好窒盐。
- 單反:焦距草则、光圈、快門蟹漓、感光度....
- 傻瓜+單反:
理解自動配置原理
- 導(dǎo)入starter --> 生效xxxxAutoConfiguration --> 組件 --> xxxProperties --> 配置文件
理解其他框架底層
- 攔截器
可以隨時定制化任何組件
- 配置文件
- 自定義組件
普通開發(fā):導(dǎo)入starter
炕横,Controller、Service葡粒、Mapper份殿、偶爾修改配置文件
高級開發(fā):自定義組件、自定義配置嗽交、自定義starter
核心:
- 這個場景自動配置導(dǎo)入了哪些組件卿嘲,我們能不能Autowired進(jìn)來使用
- 能不能通過修改配置改變組件的一些默認(rèn)參數(shù)
- 需不需要自己完全定義這個組件
- 場景定制化
最佳實戰(zhàn):
選場景,導(dǎo)入到項目
- 官方:starter
- 第三方:去倉庫搜
寫配置轮纫,改配置文件關(guān)鍵項
- 數(shù)據(jù)庫參數(shù)(連接地址腔寡、賬號密碼...)
分析這個場景給我們導(dǎo)入了哪些能用的組件
- 自動裝配這些組件進(jìn)行后續(xù)使用
- 不滿意boot提供的自動配好的默認(rèn)組件
- 定制化
- 改配置
- 自定義組件
整合redis:
選場景:
spring-boot-starter-data-redis
- 場景AutoConfiguration 就是這個場景的自動配置類
寫配置:
- 分析到這個場景的自動配置類開啟了哪些屬性綁定關(guān)系
@EnableConfigurationProperties(RedisProperties.class)
- 修改redis相關(guān)的配置
分析組件:
- 分析到
RedisAutoConfiguration
給容器中放了StringRedisTemplate
- 給業(yè)務(wù)代碼中自動裝配
StringRedisTemplate
- 分析到
定制化
- 修改配置文件
- 自定義組件,自己給容器中放一個
StringRedisTemplate
Springboot3場景實戰(zhàn)
1掌唾、常用注解
SpringBoot摒棄XML配置方式放前,改為全注解驅(qū)動
1. 組件注冊
@Configuration忿磅、@SpringBootConfiguration
@Bean、@Scope
@Controller凭语、 @Service葱她、@Repository、@Component
@Import
@ComponentScan
實例注冊IOC容器步驟:
1似扔、@Configuration 編寫一個配置類
2吨些、在配置類中,自定義方法給容器中注冊組件炒辉。配合@Bean
3豪墅、或使用@Import 導(dǎo)入第三方的組件
細(xì)節(jié)圖
以前的配置文件與bean實例注冊ioc容器寫法
springboot配置類與bean注解注冊ioc容器寫法
springboot bean名稱及配置類寫法
springboot 注冊第三方j(luò)ar包類到容器中的兩種方法,用@Bean的實例名稱默認(rèn)是方法名
2. 條件注解
- 條件注解的判斷最好都指定字符串名或字符串路徑黔寇,避免因指定的類沒有引用而報錯偶器。
如果注解指定的條件成立,則觸發(fā)指定行為
@ConditionalOnXxx
@ConditionalOnClass:如果類路徑中存在這個類缝裤,則觸發(fā)指定行為
@ConditionalOnMissingClass:如果類路徑中不存在這個類屏轰,則觸發(fā)指定行為
@ConditionalOnBean:如果容器中存在這個Bean(組件),則觸發(fā)指定行為
@ConditionalOnMissingBean:如果容器中不存在這個Bean(組件)憋飞,則觸發(fā)指定行為
@ConditionalOnResource :如果容器中存在這個資源(如配置文件)霎苗,則觸發(fā)指定行為
@ConditionalOnProperty :如果容器中存在某一個屬性(如配置文件配置了哪個屬性),則觸發(fā)指定行為
場景:
- 如果存在
FastsqlException
這個類榛做,給容器中放一個Cat
組件唁盏,名cat01, - 否則瘤睹,就給容器中放一個
Dog
組件升敲,名dog01 - 如果系統(tǒng)中有
dog01
這個組件答倡,就給容器中放一個 User組件轰传,名zhangsan - 否則,就放一個User瘪撇,名叫l(wèi)isi
@ConditionalOnBean(value=組件類型获茬,name=組件名字):判斷容器中是否有這個類型的組件,并且名字是指定的值
細(xì)節(jié)圖
@ConditionalOnClass使用
@ConditionalOnBean(name = "user01")使用
@Conditional生效范圍
@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: 聲明組件的屬性和配置文件哪些前綴開始項進(jìn)行綁定
@EnableConfigurationProperties:快速注冊注解:
- 場景:SpringBoot默認(rèn)只掃描自己主程序所在的包倔既。如果導(dǎo)入第三方包恕曲,即使組件上標(biāo)注了 @Component、@ConfigurationProperties 注解渤涌,也沒用佩谣。因為組件都掃描不進(jìn)來,此時使用這個注解就可以快速進(jìn)行屬性綁定并把組件注冊進(jìn)容器
將容器中任意組件(Bean)的屬性值和配置文件的配置項的值進(jìn)行綁定
- 1、給容器中注冊組件(@Component翼闽、@Bean)
- 2鹉究、使用@ConfigurationProperties 聲明組件和配置文件的哪些配置項進(jìn)行綁定
細(xì)節(jié)圖
屬性綁定第一種方式是一個個注入容器
對導(dǎo)入第三方組件進(jìn)行屬性綁定
屬性綁定第二種方式是@ConfigurationPropertiesScan注解掃描注入
屬性綁定是主要項目要配置編碼格式
2. YAML配置文件
痛點:SpringBoot 集中化管理配置唯袄,application.properties
問題:配置多以后難閱讀和修改钾腺,層級結(jié)構(gòu)辨識度不高
YAML 是 "YAML Ain't a Markup Language"(YAML 不是一種標(biāo)記語言)翩隧。在開發(fā)的這種語言時耸成,YAML 的意思其實是:"Yet Another Markup Language"(是另一種標(biāo)記語言)漫萄。
- 設(shè)計目標(biāo)腾窝,就是方便人類讀寫
- 層次分明缀踪,更適合做配置文件
- 使用
.yaml
或.yml
作為文件后綴
1. 基本語法
- 大小寫敏感
- 使用縮進(jìn)表示層級關(guān)系,k: v虹脯,使用空格分割k,v
- 縮進(jìn)時不允許使用Tab鍵驴娃,只允許使用空格。換行
- 縮進(jìn)的空格數(shù)目不重要循集,只要相同層級的元素左側(cè)對齊即可
- # 表示注釋托慨,從這個字符一直到行尾,都會被解析器忽略暇榴。
支持的寫法:
- 對象:鍵值對的集合厚棵,如:映射(map)/ 哈希(hash) / 字典(dictionary)
- 數(shù)組:一組按次序排列的值,如:序列(sequence) / 列表(list)
- 純量:單個的蔼紧、不可再分的值婆硬,如:字符串、數(shù)字奸例、bool彬犯、日期
2. 示例
@Component
@ConfigurationProperties(prefix = "person") //和配置文件person前綴的所有配置進(jìn)行綁定
@Data //自動生成JavaBean屬性的getter/setter
//@NoArgsConstructor //自動生成無參構(gòu)造器
//@AllArgsConstructor //自動生成全參構(gòu)造器
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=小藍(lán)
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: 小藍(lán)
age: 3
c2: {name: 小綠,age: 2} #對象也可用{}表示
3. 細(xì)節(jié)
birthDay 也可以寫為 birth-day。不推薦查吊,駝峰格式是最好的谐区,還能方便與文本搜索匹配
文本:
- 單引號不會轉(zhuǎn)義【\n 則為普通字符串顯示】
- 雙引號會轉(zhuǎn)義【\n會顯示為換行符】
大文本
-
|
開頭,大文本寫在下層逻卖,保留文本格式宋列,換行符正確顯示 -
>
開頭,大文本寫在下層评也,折疊換行符
-
多文檔合并
- 使用
---
可以把多個yaml文檔合并在一個文檔中炼杖,每個文檔區(qū)依然認(rèn)為內(nèi)容獨立
- 使用
4. 小技巧:lombok
簡化JavaBean 開發(fā)。自動生成構(gòu)造器盗迟、getter/setter坤邪、自動生成Builder模式等
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>compile</scope>
</dependency>
使用@Data
等注解
細(xì)節(jié)圖
yml寫法
properties復(fù)雜寫法
properties綁定屬性值打印結(jié)果
yml復(fù)雜寫法
加單雙引號的效果:單引號不會轉(zhuǎn)義【\n 則為普通字符串顯示】, 雙引號會轉(zhuǎn)義【\n會顯示為換行符】
大文本處理
多文檔分隔符
3. 日志配置
規(guī)范:項目開發(fā)不要編寫System.out.println()
罚缕,應(yīng)該用日志記錄信息
[圖片上傳失敗...(image-1c6941-1723480665629)]
感興趣日志框架關(guān)系與起源可參考:視頻 21~27集
1. 簡介
Spring使用commons-logging作為內(nèi)部日志艇纺,但底層日志實現(xiàn)是開放的。可對接其他日志框架黔衡。
- spring5及以后 commons-logging被spring直接自己寫了消约。
支持 jul,log4j2,logback员帮。SpringBoot 提供了默認(rèn)的控制臺輸出配置或粮,也可以配置輸出為文件。
logback是默認(rèn)使用的捞高。
雖然日志框架很多氯材,但是我們不用擔(dān)心,使用 SpringBoot 的默認(rèn)配置就能工作的很好硝岗。
SpringBoot怎么把日志默認(rèn)配置好的
1氢哮、每個starter
場景,都會導(dǎo)入一個核心場景spring-boot-starter
2型檀、核心場景引入了日志的所用功能spring-boot-starter-logging
3冗尤、默認(rèn)使用了logback + slf4j
組合作為默認(rèn)底層日志
4、日志是系統(tǒng)一啟動就要用
胀溺,xxxAutoConfiguration
是系統(tǒng)啟動好了以后放好的組件裂七,后來用的。
5仓坞、日志是利用監(jiān)聽器機(jī)制配置好的背零。ApplicationListener
。
6无埃、日志所有的配置都可以通過修改配置文件實現(xiàn)徙瓶。以logging
開始的所有配置。
2. 日志格式
2023-03-31T13:56:17.511+08:00 INFO 4944 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-03-31T13:56:17.511+08:00 INFO 4944 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.7]
默認(rèn)輸出格式:
- 時間和日期:毫秒級精度
- 日志級別:ERROR, WARN, INFO, DEBUG, or TRACE.
- 進(jìn)程 ID
- ---: 消息分割符
- 線程名: 使用[]包含
- Logger 名: 通常是產(chǎn)生日志的類名
- 消息: 日志記錄的內(nèi)容
注意: logback 沒有FATAL級別嫉称,對應(yīng)的是ERROR
默認(rèn)值:參照:spring-boot
包additional-spring-configuration-metadata.json
文件
默認(rèn)輸出格式值:%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}
可修改為:'%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n'
3. 記錄日志
Logger logger = LoggerFactory.getLogger(getClass());
或者使用Lombok的@Slf4j注解
4. 日志級別
由低到高:
ALL,TRACE, DEBUG, INFO, WARN, ERROR,FATAL,OFF
侦镇;- 只會打印指定級別及以上級別的日志
- ALL:打印所有日志
- TRACE:追蹤框架詳細(xì)流程日志,一般不使用
- DEBUG:開發(fā)調(diào)試細(xì)節(jié)日志
- INFO:關(guān)鍵织阅、感興趣信息日志
- WARN:警告但不是錯誤的信息日志壳繁,比如:版本過時
- ERROR:業(yè)務(wù)錯誤日志,比如出現(xiàn)各種異常
- FATAL:致命錯誤日志蒲稳,比如jvm系統(tǒng)崩潰
- OFF:關(guān)閉所有日志記錄
不指定級別的所有類氮趋,都使用root指定的級別作為默認(rèn)級別
SpringBoot日志默認(rèn)級別是 INFO
- 在application.properties/yaml中配置logging.level.<logger-name>=<level>指定日志級別
- level可取值范圍:
TRACE, DEBUG, INFO, WARN, ERROR, FATAL, or OFF
伍派,定義在LogLevel
類中 - root 的logger-name叫root江耀,可以配置logging.level.root=warn,代表所有未指定日志級別都使用 root 的 warn 級別
5. 日志分組
比較有用的技巧是:
將相關(guān)的logger分組在一起诉植,統(tǒng)一配置祥国。SpringBoot 也支持。比如:Tomcat 相關(guān)的日志統(tǒng)一設(shè)置
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.level.tomcat=trace
SpringBoot 預(yù)定義兩個組
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 默認(rèn)只把日志寫在控制臺,如果想額外記錄到文件舌稀,可以在application.properties中添加logging.file.name or logging.file.path配置項啊犬。
logging.file.name | logging.file.path | 示例 | 效果 |
---|---|---|---|
未指定 | 未指定 | 僅控制臺輸出 | |
指定 | 未指定 | my.log | 寫入指定文件”诓椋可以加路徑 |
未指定 | 指定 | /var/log | 寫入指定目錄觉至,文件名為spring.log |
指定 | 指定 | 以logging.file.name為準(zhǔn) |
7. 文件歸檔與滾動切割
歸檔:每天的日志單獨存到一個文檔中。
切割:每個文件10MB睡腿,超過大小切割成另外一個文件语御。
- 每天的日志應(yīng)該獨立分割出來存檔。如果使用logback(SpringBoot 默認(rèn)整合)席怪,可以通過application.properties/yaml文件指定日志滾動規(guī)則应闯。
- 如果是其他日志系統(tǒng),需要自行配置(添加log4j2.xml或log4j2-spring.xml)
- 支持的滾動規(guī)則設(shè)置如下
配置項 | 描述 |
---|---|
logging.logback.rollingpolicy.file-name-pattern | 日志存檔的文件名格式(默認(rèn)值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz) |
logging.logback.rollingpolicy.clean-history-on-start | 應(yīng)用啟動時是否清除以前存檔(默認(rèn)值:false) |
logging.logback.rollingpolicy.max-file-size | 存檔前挂捻,每個日志文件的最大大械锓摹(默認(rèn)值:10MB) |
logging.logback.rollingpolicy.total-size-cap | 日志文件被刪除之前,可以容納的最大大锌倘觥(默認(rèn)值:0B)骨田。設(shè)置1GB則磁盤存儲超過 1GB 日志后就會刪除舊日志文件 |
logging.logback.rollingpolicy.max-history | 日志文件保存的最大天數(shù)(默認(rèn)值:7). |
8. 自定義配置
通常我們配置 application.properties 就夠了。當(dā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 |
如果可能盛撑,我們建議您在日志配置中使用-spring
變量(例如,logback-spring.xml
而不是 logback.xml
)捧搞。如果您使用標(biāo)準(zhǔn)配置文件抵卫,spring 無法完全控制日志初始化。
最佳實戰(zhàn):自己要寫配置胎撇,配置文件名加上 xx-spring.xml
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支持yaml和json格式的配置文件
格式 | 依賴 | 文件名 |
---|---|---|
YAML | com.fasterxml.jackson.core:jackson-databind + com.fasterxml.jackson.dataformat:jackson-dataformat-yaml | log4j2.yaml + log4j2.yml |
JSON | com.fasterxml.jackson.core:jackson-databind | log4j2.json + log4j2.jsn |
10. 最佳實戰(zhàn)
- 導(dǎo)入任何第三方框架介粘,先排除它的日志包,因為Boot底層控制好了日志
- 修改
application.properties
配置文件晚树,就可以調(diào)整日志的所有行為姻采。如果不夠,可以編寫日志框架自己的配置文件放在類路徑下就行爵憎,比如logback-spring.xml
慨亲,log4j2-spring.xml
- 如需對接專業(yè)日志系統(tǒng),也只需要把 logback 記錄的日志灌倒 kafka之類的中間件宝鼓,這和SpringBoot沒關(guān)系刑棵,都是日志框架自己的配置,修改配置文件即可
- 業(yè)務(wù)中使用slf4j-api記錄日志愚铡。不要再 sout 了
細(xì)節(jié)圖
springboot默認(rèn)日志輸出格式配置
日志工具寫法
日志級別管理
日志分組
指定日志輸出文件位置
日志文件的歸檔和切割-logback為例
自定義log配置
使用log4j2配置蛉签,利用maven的就近依賴原則先排除后依賴胡陪,log4j2性能高于logback
使用第三方框架時,如果該框架有引用日志則要排除掉碍舍,這樣才不會沖突柠座,可以用統(tǒng)一的springboot定義的日志框架進(jìn)行管理