SpringBoot3零基礎(chǔ)教程-快速入門筆記

SpringBoot3零基礎(chǔ)教程-快速入門筆記

前置準(zhǔn)備

  • Jdk17環(huán)境
  • idea 2021.2.1+才支持Java17
  • Springboot 3.0.5+

開發(fā)百科書

Jdk17安裝

使用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)上要避免這種處理的情況,避免不易排查問題羡鸥。
  • springboot starter 官方支持的場景

    • 官方提供的場景:命名為: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打開展示被排除的文件


image.png

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)入依賴的時候聲明版本

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,是所有starterstarter茅糜,基礎(chǔ)核心starter
    • spring-boot-starter導(dǎo)入了一個包 spring-boot-autoconfigure其监。包里面都是各種場景的AutoConfiguration自動配置類
    • 雖然全場景的自動配置都在 spring-boot-autoconfigure這個包,但是不是全都開啟的限匣。
      • 導(dǎo)入哪個場景就開啟哪個自動配置

細(xì)節(jié)圖

image.png

image.png

image.png

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-jsonstarter-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-autoconfigureMETA-INF/spring/**org.springframework.boot.autoconfigure.AutoConfiguration**.imports文件指定的
    • 項目啟動的時候利用 @Import 批量導(dǎo)入組件機(jī)制把 autoconfigure 包下的142 xxxxAutoConfiguration類導(dǎo)入進(jìn)來(自動配置類
    • 雖然導(dǎo)入了142個自動配置類
  • 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%項目一定會用到底層自定義

攝影:

  • 傻瓜:自動配置好窒盐。
  • 單反:焦距草则、光圈、快門蟹漓、感光度....
  • 傻瓜+單反
  1. 理解自動配置原理

    1. 導(dǎo)入starter --> 生效xxxxAutoConfiguration --> 組件 --> xxxProperties --> 配置文件
  2. 理解其他框架底層

    1. 攔截器
  3. 可以隨時定制化任何組件

    1. 配置文件
    2. 自定義組件

普通開發(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容器寫法


image.png

springboot配置類與bean注解注冊ioc容器寫法


image.png

springboot bean名稱及配置類寫法


image.png

springboot 注冊第三方j(luò)ar包類到容器中的兩種方法,用@Bean的實例名稱默認(rèn)是方法名


image.png

image.png

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使用


image.png

@ConditionalOnBean(name = "user01")使用


image.png

image.png

@Conditional生效范圍


image.png

@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é)圖

屬性綁定第一種方式是一個個注入容器


image.png

image.png

image.png

對導(dǎo)入第三方組件進(jìn)行屬性綁定


image.png

屬性綁定第二種方式是@ConfigurationPropertiesScan注解掃描注入
image.png

屬性綁定是主要項目要配置編碼格式


image.png

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寫法


image.png

properties復(fù)雜寫法


image.png

image.png

properties綁定屬性值打印結(jié)果


image.png

yml復(fù)雜寫法
image.png

image.png

image.png

加單雙引號的效果:單引號不會轉(zhuǎn)義【\n 則為普通字符串顯示】, 雙引號會轉(zhuǎn)義【\n會顯示為換行符】


image.png

大文本處理


image.png

image.png

多文檔分隔符
image.png

3. 日志配置

規(guī)范:項目開發(fā)不要編寫System.out.println()罚缕,應(yīng)該用日志記錄信息

[圖片上傳失敗...(image-1c6941-1723480665629)]

感興趣日志框架關(guān)系與起源可參考:視頻 21~27集

1. 簡介

  1. Spring使用commons-logging作為內(nèi)部日志艇纺,但底層日志實現(xiàn)是開放的。可對接其他日志框架黔衡。

    1. spring5及以后 commons-logging被spring直接自己寫了消约。
  2. 支持 jul,log4j2,logback员帮。SpringBoot 提供了默認(rèn)的控制臺輸出配置或粮,也可以配置輸出為文件。

  3. logback是默認(rèn)使用的捞高。

  4. 雖然日志框架很多氯材,但是我們不用擔(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-bootadditional-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

  1. 在application.properties/yaml中配置logging.level.<logger-name>=<level>指定日志級別
  2. level可取值范圍:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, or OFF伍派,定義在 LogLevel類中
  3. 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睡腿,超過大小切割成另外一個文件语御。

  1. 每天的日志應(yīng)該獨立分割出來存檔。如果使用logback(SpringBoot 默認(rèn)整合)席怪,可以通過application.properties/yaml文件指定日志滾動規(guī)則应闯。
  2. 如果是其他日志系統(tǒng),需要自行配置(添加log4j2.xml或log4j2-spring.xml)
  3. 支持的滾動規(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)

  1. 導(dǎo)入任何第三方框架介粘,先排除它的日志包,因為Boot底層控制好了日志
  2. 修改 application.properties 配置文件晚树,就可以調(diào)整日志的所有行為姻采。如果不夠,可以編寫日志框架自己的配置文件放在類路徑下就行爵憎,比如logback-spring.xml慨亲,log4j2-spring.xml
  3. 如需對接專業(yè)日志系統(tǒng),也只需要把 logback 記錄的日志灌倒 kafka之類的中間件宝鼓,這和SpringBoot沒關(guān)系刑棵,都是日志框架自己的配置,修改配置文件即可
  4. 業(yè)務(wù)中使用slf4j-api記錄日志愚铡。不要再 sout 了

細(xì)節(jié)圖

springboot默認(rèn)日志輸出格式配置


image.png

日志工具寫法


image.png

image.png

日志級別管理
image.png

image.png

image.png

日志分組


image.png

image.png

指定日志輸出文件位置
image.png

image.png

日志文件的歸檔和切割-logback為例


image.png

image.png

自定義log配置


image.png

使用log4j2配置蛉签,利用maven的就近依賴原則先排除后依賴胡陪,log4j2性能高于logback


image.png

使用第三方框架時,如果該框架有引用日志則要排除掉碍舍,這樣才不會沖突柠座,可以用統(tǒng)一的springboot定義的日志框架進(jìn)行管理


image.png

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市片橡,隨后出現(xiàn)的幾起案子妈经,更是在濱河造成了極大的恐慌,老刑警劉巖捧书,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狂塘,死亡現(xiàn)場離奇詭異,居然都是意外死亡鳄厌,警方通過查閱死者的電腦和手機(jī)荞胡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來了嚎,“玉大人泪漂,你說我怎么就攤上這事⊥嵊荆” “怎么了萝勤?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呐伞。 經(jīng)常有香客問我敌卓,道長,這世上最難降的妖魔是什么伶氢? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任趟径,我火速辦了婚禮,結(jié)果婚禮上癣防,老公的妹妹穿的比我還像新娘蜗巧。我一直安慰自己,他們只是感情好蕾盯,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布幕屹。 她就那樣靜靜地躺著,像睡著了一般级遭。 火紅的嫁衣襯著肌膚如雪望拖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天挫鸽,我揣著相機(jī)與錄音说敏,去河邊找鬼。 笑死掠兄,一個胖子當(dāng)著我的面吹牛像云,可吹牛的內(nèi)容都是我干的锌雀。 我是一名探鬼主播蚂夕,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼迅诬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婿牍?” 一聲冷哼從身側(cè)響起侈贷,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎等脂,沒想到半個月后俏蛮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡上遥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年搏屑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粉楚。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡辣恋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出模软,到底是詐尸還是另有隱情伟骨,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布燃异,位于F島的核電站携狭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏回俐。R本人自食惡果不足惜逛腿,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仅颇。 院中可真熱鬧鳄逾,春花似錦、人聲如沸灵莲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽政冻。三九已至枚抵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間明场,已是汗流浹背汽摹。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留苦锨,地道東北人逼泣。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓趴泌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拉庶。 傳聞我的和親對象是個殘疾皇子嗜憔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容