天天看點

Spring Boot-自定義配置

引言:

使用傳統的Spring配置過程,就如同訂披薩的時候自己制定全部的輔料。你可以完全掌握Spring配置的内容,可是顯示聲明應用程式裡全部的Bean并不是明智之舉。而Spring Boot的自動配置就像是從菜單中選一份特色披薩,讓Spring Boot處理各種細節比自己聲明上下文裡的全部Bean要容易的多。

Spring Boot的自動配置非常靈活。就像披薩廚師可以不在你的披薩裡放香菇,而是加墨西哥胡椒一樣,Spring Boot能讓你參與進來,影響自動配置的實施。

影響Spring Boot自動配置的方式

兩種影響自動配置的方式:

  • 使用顯示配置進行覆寫Spring Boot自動配置。
  • 使用屬性檔案中的屬性進行精細化配置。
  • 使用Spring Boot提供的鈎子引入錯誤頁。

1.覆寫Spring Boot自動配置

一般來說,如果不用配置就能得到和顯式配置一樣的結果,那麼不寫配置是最直接的選擇。

大多數情況下,自動配置的Bean剛好能滿足你的需要,不需要去覆寫它們。但某些情況下,Spring Boot在自動配置時還不能很好的進行推斷。

比如說,在應用程式中添加安全特性,自動配置還做得不夠好,Spring Boot為安全提供了一些基本的自動配置,但是你還是需要自己覆寫一些配置以滿足特定的安全要求。

現在就程式的安全工作,舉例說明:

Spring Boot自動配置讓應用程式的安全工作變得易如反掌,你要做的隻是添加Secuirty起步依賴。

Gradle:

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
           

這樣就是一個安全的Web應用,預設在打開應用程式時,進行HTTP基礎身份驗證框。使用者名為user,密碼是在應用程式每次運作時随機生成後寫入日志的,比如:

Using default security password:d9d8abe5-42b5-4f20-a32a076ee3dff658d9

.通常我們的應用程式的需要一個更好的登入頁,更多使用者并且是基于資料庫或LDAP(Lightweight Directory Access Protocol)使用者存儲的身份驗證服務。是以需要覆寫自動配置的安全設定。

覆寫自動配置很簡單,就當自動配置不存在,直接顯式寫一段配置,顯式配置的形式不限,Spring支援XML和Groovy形式配置,使用Java配置都可以。Spring Boot會發現你的配置,随後降低自動配置的優先級,以你的配置為準。

為什麼Spring允許自動配置被覆寫?

Spring Boot自帶很懂配置類,每一個都能運用在你的應用程式裡。它們都是用Spring4.0的條件化配置,可以在運作時判斷這個配置是否被運用。@ConditionalOnMissingBean注解是覆寫自動配置的關鍵,指被@Bean注解的方法使用了@ConditionalOnMissingBean注解,當應用程式中不存在該注解括号中配置的Bean時才生效,該方法才會被執行。

2.通過屬性檔案外置配置

Spring Boot提供了300多個用于微調的屬性,當你調整設定時,隻要在環境變量、jav系統屬性、JNDI、指令行參數或者屬性檔案裡進行指定。如:設定資料庫URL,端口号,日志級别等。

Spring Boot應用程式有多種設定途徑。Spring Boot能夠從多種屬性源擷取屬性,按優先級排序,包括:

  • 1.指令行參數
  • 2.java:comp/env裡的JNDI屬性
  • 3.JVM系統屬性
  • 4.作業系統環境變量
  • 5.随機生成的帶random.*字首的屬性(在設定其他屬性時,可以引用它們,比如${random.long})
  • 6.應用程式以外的application.properties或者application.yml檔案
  • 7.打包在應用程式内的application.properties或者application.yml檔案
  • 8.通過@PropertySource标注的屬性源
  • 9.預設屬性

application.properties和application.yml檔案可以放在以下4個位置,同一優先級位置同時有application.properties和application.yml檔案,那麼application.yml檔案會覆寫application.properties,按優先級排序如下:

  • 1.外置,在相對于應用程式運作目錄的/config子目錄裡。
  • 2.外置,在應用程式運作的目錄裡。
  • 3.内置,在config包内。
  • 4.内置,在Classpath根目錄

3.定制應用程式錯誤頁面

Spring Boot提供”白标”(whitelabel)錯誤頁,這是自動配置的一部分。比Stacktrace頁面要好一點。

Spring Boot自動配置的預設錯誤處理器會查找名為error的視圖,如果找不到就用預設的白标錯誤視圖。是以,最簡單的方法就是建立一個自定義視圖,,讓解析出的試圖名為error。

取決于錯誤試圖解析時采用的視圖解析器。

實作了Spring的View接口的Bean,其ID為error(由Spring的BeanNameViewResolver所解析)

如果配置了Thymeleaf,則有名為error.html的Thymeleaf模闆。

如果配置了FreeMarker,則有名為error.ftl的FreeMarker模闆。

如果配置了Velocity,則有名為error.vm的Velocity模闆。

如果是JSP視圖,則有名為error.jsp的JSP模闆。

例子:使用Thymeleaf,建立一個名為error.html的檔案。在Maven或者Gradle項目裡,将該檔案放在src/main/resources/templates中,運作時它就在Classpath的根目錄裡。錯誤圖檔應該放在src/main/resources/static或src/main/resources/public,這樣應用程式才能找到它。

error.html檔案内容:

Spring Boot-自定義配置

Spring Boot會為錯誤試圖提供如下錯誤屬性:

timestamp:發生錯誤的時間。

status:HTTP狀态碼。

error:錯誤原因。

exception:異常的類名。

message:異常資訊(如果這個錯誤是由異常引起的)。

errors:BindingResult異常裡的各種錯誤(如果這個錯誤是由異常引起的)。

trace:異常跟蹤資訊(如果這個錯誤是由異常引起的)。

path:錯誤時請求的URL路徑。