spring-boot-starter-logging和spring-boot-starter-web

本節主要講解 spring-boot-starter-logging 和 spring-boot-starter-web 兩個常見通用的 spring-boot-starter 模塊。

應用日誌和spring-boot-starter-logging

Java 的日誌系統多種多樣,從 java.util 默認提供的日誌支持,到 log4j,log4j2,commons logging 等,複雜繁多,所以,應用日誌系統的配置就會比較特殊,從而 spring-boot-starter-logging 也比較特殊一些,下面將其作為我們第一個瞭解的自動配置依賴模塊。

假如 maven 依賴中添加了 spring-boot-starter-logging,如以下代碼所示:

<code><dependency>
<groupid> org.springframework.boot /<groupid>
<artifactid> spring-boot-starter-logging /<artifactid>
/<dependency>/<code>

那麼,我們的 SpringBoot 應用將自動使用 logback 作為應用日誌框架,SpringBoot 啟動的時候,由 org.springframework.boot.logging.Logging-Application-Listener 根據情況初始化並使用。SpringBoot 為我們提供了很多默認的日誌配置,所以,只要將 spring-boot-starter-logging 作為依賴加入到當前應用的 classpath,則“開箱即用”,不需要做任何多餘的配置,但假設我們要對默認 SpringBoot 提供的應用日誌設定做調整,則可以通過幾種方式進行配置調整:

  • 遵循 logback 的約定,在 classpath 中使用自己定製的 logback.xml 配置文件。
  • 在文件系統中任何一個位置提供自己的 logback.xml 配置文件,然後通過 logging.config 配置項指向這個配置文件來啟用它,比如在 application.properties 中指定如下的配置。
<code>logging.config=/{some.path.you.defined}/any-logfile-name-I-like.log/<code>

SpringBoot 默認允許我們通過在配置文件或者命令行等方式使用 logging.file 和 logging.path 來自定義日誌文件的名稱和存放路徑,不過,這只是允許我們在 SpringBoot 框架預先定義的默認日誌系統設定的基礎上做有限的設置,如果我們希望更靈活的配置,最好通過框架特定的配置方式提供相應的配置文件,然後通過 logging.config 來啟用。如果大家更習慣使用 log4j 或者 log4j2,那麼也可以採用類似的方式將它們對應的 spring-boot-starter 依賴模塊加到 Maven 依賴中即可:

<code><dependency>
<groupid> org.springframework.boot /<groupid>
<artifactid> spring-boot-starter-log4j /<artifactid>
/<dependency>/<code>

或者

<code><dependency>
<groupid> org.springframework.boot /<groupid>
<artifactid> spring-boot-starter-log4j2 /<artifactid>
/<dependency>/<code>

但一定不要將這些完成同一目的的 spring-boot-starter 都加到依賴中。

快速 Web 應用開發與 spring-boot-starter-web

在這個互聯網時代,使用 Spring 框架除了開發少數的獨立應用,大部分情況下實際上在使用 SpringMVC 開發 web 應用,為了幫我們簡化快速搭建並開發一個 Web 項目,SpringBoot 為我們提供了 spring-boot-starter-web 自動配置模塊。只要將 spring-boot-starter-web 加入項目的 maven 依賴:

<code><dependency>
<groupid>org.springframework.boot/<groupid>

<artifactid>spring-boot-starter-web/<artifactid>
/<dependency>/<code>

我們就得到了一個直接可執行的 Web 應用,當前項目下運行 mvn spring-boot:run 就可以直接啟動一個使用了嵌入式 tomcat 服務請求的 Web 應用,只不過,我們還沒有提供任何服務 Web 請求的 Controller,所以,訪問任何路徑都會返回一個 SpringBoot 默認提供的錯誤頁面(一般稱其為 whitelabel error page),我們可以在當前項目下新建一個服務根路徑 Web 請求的 Controller 實現:

<code>@RestController
public class IndexController {
@RequestMapping("/")
public String index() {
return "hello, there";
}
}/<code>

重新運行 mvn spring-boot:run 並訪問 http://localhost:8080,錯誤頁面將被我們的 Controller 返回的消息所替代,一個簡單的 Web 應用就這樣完成了。但是,簡單的背後,其實卻有很多“潛規則”(約定),我們只有充分了解了這些“潛規則”,才能更好地應用 spring-boot-starter-web。

項目結構層面的約定

項目結構層面與傳統打包為 war 的 Java Web 應用的差異在於,靜態文件和頁面模板的存放位置變了,原來是放在 src/main/webapp 目錄下的一系列資源,現在都統一放在 src/main/resources 相應子目錄下,比如:

  • src/main/resources/static 用於存放各類靜態資源,比如 css,js 等。
  • src/main/resources/templates 用於存放模板文件,比如 *.vm。

當然,如果還是希望以 war 包的形式,而不是 SpringBoot 推薦使用的獨立 jar 包形式發佈 Web 應用,也可以繼續原來 Java Web 應用的項目結構約定。

SpringMVC 框架層面的約定和定製

spring-boot-starter-web 默認將為我們自動配置如下一些 SpringMVC 必要組件:

  • 必要的 ViewResolver,比如 ContentNegotiatingViewResolver 和 Bean-NameViewResolver。
  • 將必要的 Converter、GenericConverter 和 Formatter 等 bean 註冊到 IoC 容器。
  • 添加一系列的 HttpMessageConverter 以便支持對 Web 請求和相應的類型轉換。
  • 自動配置和註冊 MessageCodesResolver。
  • 其他。

任何時候,如果我們對默認提供的 SpringMVC 組件設定不滿意,都可以在 IoC 容器中註冊新的同類型的 bean 定義來替換,或者直接提供一個基於 WebMvcConfigurerAdapter 類型的 bean 定義來定製,甚至直接提供一個標註了 @EnableWebMvc 的 @Configuration 配置類完全接管所有 SpringMVC 的相關配置,自己完全重新配置。


分享到:


相關文章: