[參考](https://logback.qos.ch/manual/configuration.html#autoScan)
[toc]
## 配置文件語法
logback配置文件的基本結構

### 配置logger元素
使用`<logger>`元素配置記錄器。 `<logger>`元素只接受一個必需的`name`屬性,一個可選的`level`屬性和一個可選的`additivity`屬性,`additivity`允許值為true或false。 level屬性的值允許一個不區分大小寫的字符串值TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF。 特殊于大小寫不敏感的值INHERITED或其同義詞NULL將強制記錄器的級別從層次結構中的較高級別繼承。 如果您設置記錄器的級別并稍后決定它應該繼承其級別,這會派上用場。
`<logger>`元素可以包含零個或多個`<appender-ref>`元素; 這樣引用的每個`appender`都被添加到指定的`logger`中。 請注意,與log4j不同,logback-classic在配置給定記錄器時不會關閉也不會刪除任何先前引用的appender
### 配置root元素
`<root>`元素配置根記錄器。 它支持單個屬性,即level屬性。 它不允許任何其他屬性,因為additivity標志不適用于根記錄器。 此外,由于根記錄器已被命名為“ROOT”,因此它也不允許使用name屬性。 level屬性的值可以是不區分大小寫的字符串TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF之一。 請注意,根記錄器的級別不能設置為INHERITED或NULL。
與`<logger>`元素類似,`<root>`元素可以包含零個或多個`<appender-ref>`元素; 這樣引用的每個appender都被添加到根記錄器中。 請注意,與log4j不同,logback-classic在配置根記錄器時不會關閉也不會刪除任何先前引用的appender。
### 例子
假設我們不再有興趣查看屬于“chapters.configuration”包的任何組件的任何DEBUG消息。 以下配置文件顯示了如何實現該目的。
```
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="chapters.configuration" level="INFO"/>
<!-- Strictly speaking, the level attribute is not necessary since -->
<!-- the level of the root level is set to DEBUG by default. -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
```
當上述配置文件作為MyApp3應用程序的參數給出時,它將產生以下輸出:
```
17:34:07.578 [main] INFO chapters.configuration.MyApp3 - Entering application.
17:34:07.578 [main] INFO chapters.configuration.MyApp3 - Exiting application.
```
>請注意,“chapters.configuration.Foo”記錄器生成的級別DEBUG消息已被禁止。 另見Foo類。
您可以根據需要配置多個記錄器的級別。 在下一個配置文件中,我們將chapters.configuration記錄器的級別設置為INFO,但同時將chapters.configuration.Foo記錄器的級別設置為DEBUG。
```
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="chapters.configuration" level="INFO" />
<logger name="chapters.configuration.Foo" level="DEBUG" />
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
```
使用此配置文件運行MyApp3將導致控制臺上的以下輸出:
```
17:39:27.593 [main] INFO chapters.configuration.MyApp3 - Entering application.
17:39:27.593 [main] DEBUG chapters.configuration.Foo - Did it again!
17:39:27.593 [main] INFO chapters.configuration.MyApp3 - Exiting application.
```
下表列出了記錄器及其級別。
| logger name | 指定級別 | 生效級別 |
|---|---|---|
| root | DEBUG | DEBUG |
| chapters.configuration| INFO| INFO|
| chapters.configuration.MyApp3| null| INFO|
| chapters.configuration.Foo| DEBUG | DEBUG |
因此,MyApp3類中的INFO級別的兩個日志記錄語句以及Foo.doIt()中的DEBUG消息都被啟用。 請注意,根記錄器的級別始終設置為非空值,默認情況下為DEBUG。
讓我們注意,基本選擇規則取決于被調用的記錄器的有效級別,而不是附加的記錄器的級別。 Logback將首先確定是否啟用了日志記錄語句,如果啟用,它將調用記錄器層次結構中找到的appender,而不管它們的級別如何。 配置文件sample4.xml就是一個例子:
```
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="chapters.configuration" level="INFO" />
<!-- 關閉記錄器 (children can override) -->
<root level="OFF">
<appender-ref ref="STDOUT" />
</root>
</configuration>
```
下表列出了記錄器及其級別。
| logger name | 指定級別 | 生效級別 |
|---|---|---|
| root | OFF| OFF|
| chapters.configuration| INFO| INFO|
| chapters.configuration.MyApp3| null| INFO|
| chapters.configuration.Foo| null| INFO|
名為`STDOUT`的ConsoleAppender是sample4.xml中唯一配置的appender,它附加到根級記錄器,其級別設置為`OFF`。 但是,使用配置腳本sample4.xml運行MyApp3將產生:
```
17:52:23.609 [main] INFO chapters.configuration.MyApp3 - Entering application.
17:52:23.609 [main] INFO chapters.configuration.MyApp3 - Exiting application.
```
因此,根記錄器的級別沒有明顯的效果,因為`chapters.configuration.MyApp3`和`chapters.configuration.Foo`類中的記錄器都為`INFO`級別啟用。 作為旁注,`chapters.configuration`記錄器憑借其在配置文件中的聲明而存在 - 即使Java源代碼沒有直接引用它。
### 配置Appenders
appender使用`<appender>`元素配置,該元素采用兩個必需屬性name和class。 name屬性指定appender的名稱,而class屬性指定要實例化的appender類的完全限定名稱。 `<appender>`元素可以包含零個或一個`<layout>`元素,零個或多個`<encoder>`元素以及零個或多個`<filter>`元素。 除了這三個公共元素之外,`<appender>`元素可以包含與appender類的JavaBean屬性相對應的任意數量的元素。 無縫支持給定logback組件的任何屬性是Joran的主要優勢之一,如后面的章節所述。 下圖說明了常見的結構。 請注意,對屬性的支持不可見。

`<layout>`元素采用必需的class屬性,指定要實例化的布局類的完全限定名稱。 與`<appender>`元素一樣,`<layout>`可以包含與layout實例的屬性對應的其他元素。 如果布局類是常見的`PatternLayout`,則可以省略class屬性,如默認類映射規則所指定。
`<encoder>`元素采用必需的class屬性,指定要實例化的編碼器類的完全限定名稱。如果編碼器類是`PatternLayoutEncoder`,則可以省略class屬性,如默認類映射規則所指定的那樣。
記錄到多個appender就像定義各種appender并在記錄器中引用它們一樣簡單,如下一個配置文件所示:
```
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myApp.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
```
此配置腳本定義了兩個名為FILE和STDOUT的appender。 FILE appender將記錄到名為myApp.log的文件中。 此appender的編碼器是PatternLayoutEncoder,它輸出日志請求所在的日期,級別,線程名稱,記錄器名稱,文件名和行號,消息和行分隔符。 第二個稱為STDOUT的appender輸出到控制臺。 此appender的編碼器僅輸出消息字符串,后跟行分隔符。
appender通過在appender-ref元素中按名稱引用它們而附加到根記錄器。 請注意,每個appender都有自己的編碼器。 編碼器通常不被設計為由多個appender共享。 布局也是如此。 因此,logback配置文件不提供用于共享編碼器或布局的任何語法手段。
#### appender 累積
默認情況下,appender是累積的:記錄器將記錄到自身附加的appender(如果有的話)以及附加到其祖先的所有appender。 因此,將相同的appender附加到多個記錄器將導致日志記錄輸出重復。
```
View as .groovy
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="chapters.configuration">
<appender-ref ref="STDOUT" />
</logger>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
```
使用此配置運行MyApp3將產生以下輸出:
```
14:25:36.343 [main] INFO chapters.configuration.MyApp3 - Entering application.
14:25:36.343 [main] INFO chapters.configuration.MyApp3 - Entering application.
14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
14:25:36.359 [main] INFO chapters.configuration.MyApp3 - Exiting application.
14:25:36.359 [main] INFO chapters.configuration.MyApp3 - Exiting application.
```
注意重復的輸出。 名為STDOUT的appender附加到兩個記錄器,root和chapters.configuration。 由于根記錄器是所有記錄器和章節的祖先。配置是chapters.configuration.MyApp3和chapters.configuration.Foo的父親,因此使用這兩個記錄器進行的每個記錄請求將輸出兩次,因為STDOUT被附加到 chapters.configuration和一次因為它附加到root。
Appender可加性不是新用戶的陷阱。 這是一個非常方便的回歸功能。 例如,您可以配置日志記錄,以便日志消息顯示在控制臺上(對于系統中的所有記錄器),而僅來自某些特定記錄器集的消息則流入特定的追加器。
```
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myApp.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<logger name="chapters.configuration">
<appender-ref ref="FILE" />
</logger>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
```
在此示例中,控制臺appender將記錄所有消息(對于系統中的所有記錄器),而只有來自chapters.configuration記錄器及其子記錄的記錄請求將進入myApp.log文件。
#### 重寫默認累積行為
如果默認累積行為證明不適合您的需要,您可以通過將additivity標志設置為false來覆蓋它。 因此,記錄器樹中的分支可以將輸出定向到與樹的其余部分不同的一組appender。
```
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>foo.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<logger name="chapters.configuration.Foo" additivity="false">
<appender-ref ref="FILE" />
</logger>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
```
這個例子,名為FILE的appender附加到chapters.configuration.Foo記錄器。 此外,chapters.configuration.Foo記錄器將其additivity標志設置為false,以使其日志記錄輸出將發送到名為FILE的appender,但不會發送到層次結構中較高的任何appender。 其他記錄器仍然無視chapters.configuration.Foo記錄器的可加性設置。 使用additivityFlag.xml配置文件運行MyApp3應用程序將從chapters.configuration.MyApp3記錄器輸出控制臺上的結果。 但是,chapters.configuration.Foo記錄器的輸出將出現在foo.log文件中,并且僅出現在該文件中。
#### FileAppender
append元素,如果為true,則會在現有文件的末尾附加事件。 否則,如果append為false,則截斷任何現有文件。 默認情況下,append選項設置為true。
prudent元素,謹慎模式,即使存在可能在不同主機上運行的不同JVM中運行的其他FileAppender實例,FileAppender也會安全地寫入指定文件。 prudent模式的默認值為false。
盡管存在一些限制,但謹慎模式可與RollingFileAppender結合使用。
謹慎模式意味著append屬性自動設置為true。
謹慎更依賴于獨占文件鎖。 實驗表明,文件鎖定大約是編寫日志記錄事件的三倍(x3)。 在寫入位于本地硬盤上的文件的“普通”PC上,當謹慎模式關閉時,編寫單個日志記錄事件大約需要10微秒。 當謹慎模式打開時,輸出單個記錄事件大約需要30微秒。 這意味著當謹慎模式關閉時記錄吞吐量為每秒100'000個事件,而謹慎模式下每秒記錄大約33'000個事件。
### 設置上下文名稱
如前一章所述,每個記錄器都附加到記錄器上下文。 默認情況下,記錄器上下文稱為“默認”。 但是,您可以在<contextName>配置指令的幫助下設置不同的名稱。 請注意,一旦設置,就無法更改記錄器上下文名稱。 設置上下文名稱是一種簡單而直接的方法,以便區分記錄到同一目標的多個應用程序。
```
<configuration>
<contextName>myAppName</contextName>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %contextName [%t] %level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
```
最后一個示例說明了記錄器上下文的命名。 在布局模式中添加contextName轉換字將輸出所述名稱。
### 定義變量
變量可以在配置文件本身中一次定義一個,也可以從外部屬性文件或外部資源批量加載。 由于歷史原因,用于定義變量的XML元素是<property>,盡管在logback 1.0.7及更高版本中元素<variable>可以互換使用。
下一個示例顯示了在配置文件開頭聲明的變量。 然后在文件的下方使用它來指定輸出文件的位置。
```
<configuration>
<property name="USER_HOME" value="/home/sebastien" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${USER_HOME}/myApp.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>
```
下一個示例顯示使用System屬性來實現相同的結果。 該屬性未在配置文件中聲明,因此logback將在“系統”屬性中查找該屬性。 可以在命令行上設置Java系統屬性,如下所示:
```
java -DUSER_HOME="/home/sebastien" MyApp2
```
### 配置encoder
編碼器負責將事件轉換為字節數組,并將該字節數組寫入`OutputStream`。 編碼器在logback版本0.9.19中引入。 在以前的版本中,大多數appender依靠布局將事件轉換為字符串并使用`java.io.Writer`將其寫出來。 在以前版本的logback中,用戶可以在`FileAppender`中嵌套`PatternLayout`。 由于logback 0.9.19,`FileAppender`和子類需要一個編碼器而不再采用布局。
為什么突破變化?
如下一章中詳細討論的,布局只能將事件轉換為字符串。 此外,由于布局無法控制何時寫出事件,因此布局無法將事件聚合到批處理中。 將此與編碼器進行對比,編碼器不僅可以完全控制寫出的字節格式,還可以控制何時(以及是否)寫出這些字節。
目前,`PatternLayoutEncoder`是唯一真正有用的編碼器。 它只包裝了一個完成大部分工作的`PatternLayout`。 因此,除了不必要的復雜性之外,編碼器看起來并沒有帶來太大的影響。 但是,我們希望隨著新的強大編碼器的出現,這種印象會發生變化。
#### LayoutWrappingEncoder
在版本0.9.19之前,許多appender依賴于Layout實例來控制日志輸出的格式。 由于存在大量基于布局界面的代碼,我們需要一種編碼器與布局互操作的方法。 LayoutWrappingEncoder填補了編碼器和布局之間的空白。 它實現了編碼器接口并包裝了一個布局,它將委托轉換為字符串的工作。
#### PatternLayoutEncoder
鑒于PatternLayout是最常用的布局,logback適用于PatternLayoutEncoder的這種常見用例,LayoutWrappingEncoder的擴展僅限于包裝PatternLayout的實例。
從logback版本0.9.19開始,只要FileAppender或其子類之一配置了PatternLayout,就必須使用PatternLayoutEncoder。 這在logback錯誤代碼的相關條目中進行了解釋。
#### pattern
Logback經典船舶具有靈活的布局,稱為PatternLayout。與所有布局一樣,PatternLayout接受日志記錄事件并返回String。但是,可以通過調整PatternLayout的轉換模式來自定義此String。
PatternLayout的轉換模式與C編程語言中printf()函數的轉換模式密切相關。轉換模式由文字文本和稱為轉換說明符的格式控制表達式組成。您可以在轉換模式中插入任何文字文本。每個轉換說明符都以百分號'%'開頭,后跟可選的格式修飾符,轉換字和大括號之間的可選參數。轉換字控制要轉換的數據字段,例如,記錄器名稱,級別,日期或線程名稱。格式修飾符控制字段寬度,填充和左對齊或右對齊。
正如已經多次提到的那樣,FileAppender和子類需要一個編碼器。因此,當與FileAppender或其子類一起使用時,PatternLayout必須包含在編碼器中。鑒于FileAppender / PatternLayout組合如此常見,logback附帶了一個名為PatternLayoutEncoder的編碼器,該編碼器僅用于包裝PatternLayout實例,以便可以將其視為編碼器。

- I. Spring Boot Documentation
- 1.關于文檔
- 2. 獲取幫助
- 3.第一步
- 4.使用spring boot
- 5.學習spring boot的特點
- 6.轉移到生產
- 7.高級話題
- II. Getting Started
- 8.引入spring boot
- 9.系統需要
- 9.1 Servlet容器
- 10.安裝spring boot
- 10.1 java開發者安裝說明
- 10.1.1 Maven Installation
- 10.2 Installing the Spring Boot CLI TODO
- 10.3 從早期的版本升級
- 11.開發你的第一個spring boot應用
- 11.1 創建POM
- 11.2 添加Classpath依賴
- 11.3 寫代碼
- 11.3.1 @RestController 和@RequestMapping 注解
- 11.3.2 @EnableAutoConfiguration注解
- 11.3.3 main方法
- 11.4運行 Example
- 11.5 創建可執行的Jar
- 12.下一步要閱讀的
- III. Using Spring Boot
- 13.構建系統
- 13.1 依賴管理
- 13.2 Maven
- 13.2.1 繼承Starter Parent
- 13.2.2 不使用Spring Boot的Parent POM
- 13.2.3 使用Spring Boot Maven 插件
- 13.3. Gradle TODO
- 13.4. Ant TODO
- 13.5. Starters TODO
- 14.結構化代碼
- 14.1使用“default”包
- 14.2 主應用程序類的位置
- 15.配置類
- 15.1 引入新增的配置類
- 15.2 引入xml配置
- 16.自動化配置
- 16.1 逐漸替換自動配置
- 16.2 禁用特定的配置類
- 17.spring的bean和依賴配置
- 18.使用@SpringBootApplication注解
- 19.運行的你的程序
- 19.1 在IDE中運行
- 19.2 運行打包的jar
- 19.3 使用maven插件運行
- 19.4 使用Gradle 插件 TODO
- 19.5 熱交換
- 20.開發者工具
- 20.1 默認屬性
- 20.2 自動重啟
- 20.2.1 記錄環境評估的更改
- 20.2.2 排除Resources
- 20.2.3 監視其他路徑
- 20.2.4 禁止重啟
- 20.2.5 使用觸發文件
- 20.2.6 自定義重啟類加載器
- 20.2.7 了解限制
- 20.3 實時加載
- 20.4 全局設置
- 20.5 遠程應用
- 20.5.1 運行遠程客戶端
- 20.5.2 遠程更新
- 21.把你的應用打包到生產
- 22.下一步要閱讀的
- IV. Spring Boot features
- 23.spring應用
- 23.1 啟動失敗
- 23.10 管理功能
- 23.8 使用ApplicationRunner 或 CommandLineRunner
- 24.可擴展的配置
- 24.1 配置隨機值
- 24.2 訪問命令行屬性
- 24.3 配置文件
- 24.4 特定配置文件
- 24.5 屬性的占位符
- 24.6 使用yaml替代properties
- 24.7 類型安全的配置屬性
- 24.7.1 第三方配置
- 24.7.2 靈活的綁定
- 25.外部的配置profiles
- 25.1 追加可用的外部配置
- 25.2 編程式的設置外部配置
- 25.3 外部配置文件
- 26.日志
- 26.1 日志格式
- 26.2 控制臺輸出
- 26.2.1顏色代碼數據
- 26.3 文件輸出
- 26.4 日志級別
- 26.5 自定義日志配置
- 26.6 Logback擴展
- 26.6.1特定于配置文件的配置
- 26.6.2 環境屬性
- 26.6.3 logback.xml配置說明
- 27.開發web應用
- 27.1 spring mvc
- 27.1.1 Spring MVC自動配置
- 27.1.2 HttpMessageConverters
- 27.1.3 定制JSON序列號和反序列化
- 27.1.4 MessageCodesResolver
- 27.1.5 靜態內容
- 27.1.6 歡迎頁面
- 27.1.7 定制Favicon
- 27.1.8 路徑匹配和內容判斷
- 27.1.9 ConfigurableWebBindingInitializer
- 27.1.10 模板引擎
- 27.1.11 處理錯誤
- 27.1.12 Spring HATEOAS
- 27.1.13 跨域支持
- 27.2 spring webflux
- 28.安全
- 28.1 mvc安全
- httpSecurity,webSecurity,authenticationManager
- 29.使用SQL數據庫
- 29.1 配置數據源
- 29.1.1 嵌入式數據庫支持
- 29.1.2 可用于生產的數據庫
- 29.1.3 從JNDI DataSource獲取連接
- 30.使用NoSql技術
- 30.1 Redis
- 30.1.1 連接Redis
- 31.緩存
- 32.消息
- 32.1 jms
- 32.2 amqp
- 32.2.1 支持RabbitMQ
- 32.2.2 發送消息
- 32.2.3 接收消息
- 33.使用RestTemplate調用REST服務
- 34.使用WebClient調用REST 服務
- 35.驗證
- 36.發郵件
- 37.使用JTA的分布式事務
- 37.01 結合spring框架的本地事務
- 38. Hazelcast
- 39.定時任務
- 40.spring集成
- 41.spring會話
- 42.JMX的監控和管理
- 43.測試
- 43.1測試范圍的依賴
- 43.2 測試Spring應用
- 43.2 測試spring boot應用
- 44. WebSockets
- 45. Web Services
- 46.創建你自己的自動化配置
- 47. Kotlin的支持
- 48.下一步要閱讀的
- V. Spring Boot Actuator: Production-ready features
- 49.開啟生產用的特性
- 50.端點
- 50.1 啟動端點
- 50.2 暴露端點
- 50.3 安全的http端點
- 51.HTTP的監控和管理
- 52.JMX的監控和管理
- 53.日志
- 54.度量
- 55.審計
- 56.HTTP追蹤
- 57.過程監控
- 58.上云的支持
- 59.下一步要閱讀的
- VI. Deploying Spring Boot Applications
- 60.云端的部署
- 61.安裝spring boot應用
- 62.下一步要閱讀的
- VII. Spring Boot CLI
- 63.安裝CTL
- 64.使用CTL
- 65.使用Groovy Beans DSL開發應用
- 66.使用settings.xml配置CTL
- 67.下一步要閱讀的
- VIII. Build tool plugins
- 68. Spring Boot Maven插件
- 69. Spring Boot Gradle插件
- 70. Spring Boot AntLib模塊
- 71.其他構建系統的支持
- 72.下一步要閱讀的
- IX. ‘How-to’ guides
- 73.spring boot應用
- 74.屬性和配置
- 75.嵌入式的web服務器
- 76. Spring MVC
- 76.1 寫JSON風格的服務
- 76.2 寫XML風格的服務
- 76.3 定制Jackson ObjectMapper
- 76.4 定制@ResponseBody呈現
- 76.5 處理文件上傳
- 77. Jersey
- 78. HTTP Clients
- 79. 日志
- 80. 數據訪問
- 80.1 配置自己的數據源
- 81. 數據庫初始化
- 82. 消息
- 83. 批處理應用
- 84. Actuator
- 85. 安全
- 86. 熱交換
- 87.構建
- 88.傳統開發
- X. Appendices
- A.通用的配置
- B. 配置元信息
- C.自動配置類
- D. 測試自動配置注解
- E. 可執行的jar格式
- F. 依賴的版本