Spring Boot 2.2中有什麼新功能? - oio

banq發表於2019-12-15

Spring Boot 2.2最近已釋出,並具有一系列新功能。在相當數量的Spring專案的依賴項升級中,Spring Boot 2.2中的其他更改如下:
  • 支援Java 13
  • JUnit 5
  • Jakarta EE依賴項
  • 延遲初始化
  • RSocket支援
  • Hibernate 方言
  • Kubernetes檢測
  • 以及其他類似項:執行狀況指示器組,AssertJ 3.12,Spring HATEOAS 1.0,DataSize遷移,Elasticsearch,執行器HTTP跟蹤和稽核,Gradle要求,Jetty日誌記錄配置,Hamcrest 2.1,Freemarker模板配置,預設情況下禁用HttpHiddenMethodFilter,執行狀況指示器,測試應用程式引數,Banner...

Deprecations棄用
首先,我想提醒您注意Spring Boot 2.1中引入的棄用,這些棄用已在新版本(2.2)中完全刪除。因此,如果要從舊版本遷移,則必須擺脫專案中使用的所有不推薦使用的方法。
您可以透過訪問Spring docs網頁搜尋類,方法,介面和其他不贊成使用的內容的列表來找到更多資訊。(例如:https : //docs.spring.io/spring-boot/docs/current/api/deprecated-list.html

Java 13支援
Spring Boot有趣的部分是它不僅支援Java 8和11,而且還與最近(截至2019年9月17日)釋出的新Java 13版本相容。

JUnit 5
功能豐富的單元測試庫JUnit 5已作為預設支援新增到Spring Boot 2.2 Starter Application。這意味著JUnit 5是預設的測試庫依賴項。
為了執行測試,應使用以下包裝程式:

  • Maven包裝器: ./mvnw clean test
  • 搖籃包裝器: ./gradlew clean test

如果訪問Spring Boot入門頁面http://start.spring.io並生成一個專案,則會發現建立的專案包含JUnit 5的所有必需依賴項。
此外,如果您仍在使用JUnit 4並想遷移到新的Spring Boot版本,則不必擔心或將所有內容遷移到JUnit 5,因為JUnit 5的引擎支援現有的JUnit 4測試類。
假設您將Maven與JUnit 4的Maven Surefire外掛一起使用,則需要考慮一些因素,例如listener屬性。例如,您可以參考Spring Boot 2.2發行說明
要考慮的另一個關鍵點是建立Spring Boot測試。首先,您可以使用在隨機埠上執行的Web伺服器(@LocalServerPort)或使用具有模擬依賴項(@MockBean)在隨機埠上執行的Web伺服器)建立Spring Boot測試;其次,您可以使用以下注釋的建立一個Mock模擬層:@AutoConfigureMockMvc.

Spring Boot 2.2的其他測試依賴項升級是AssertJ 3.13.2,Hamcrest 2.1和Mockito 3.1.0。

Jakarta EE依賴項
如果您還沒有聽說過Jakarta EE,那就不用擔心。Jakarta EE是Java Enterprise Edition的規範。Jakarta EE是Java專注於雲端計算的關鍵。如果您對此主題感興趣,可以閱讀https://www.eclipse.org新聞通訊中的文章。
回到我們的主題,在Spring Boot 2.2中,一些依賴項已從Java EE移至Jakarta EE依賴項:   

  • javax group ID -> jakarta group ID

請注意,您現在應該移至Jakarta EE API依賴性,因為最終將消除Java EE API依賴性。

延遲初始化
為了啟用延遲初始化,Spring Boot 2.2中引入了一個新屬性。在較舊的版本中也可以這樣做,但是啟用延遲初始化的過程非常困難,因為您需要編寫BeanFactoryPostProcessor。在Spring Boot 2.2中,您可以透過將其設定spring.main.lazy-initialization為true 來啟用它。
它的優點是減少了啟動時間,因為在應用程式啟動期間載入了更少的類並建立了更少的bean。
如果您想知道為什麼我沒有提到Spring Boot的DevTools,那麼答案就是:Spring Boot已經包含DevTools,可以幫助您提高生產率。DevTools不會在每次進行新更改時都重新啟動JVM和應用程式,而是在同一JVM例項中使用熱重新啟動。即使重新啟動後原始時間減少了80%,使用spring.main.lazy-initialization它時甚至可以減少更多,直接在IDE中減少了64%。

​​​​​​但是為什麼預設情況下不啟用它?
這會產生一些在啟動時就應該指出的問題,因為有些類將不再載入,或者直到必要時才建立bean。產生的錯誤應包括:

  • NoClassDefFoundError
  • OutOfMemoryError
  • 因配置錯誤而導致的故障

為了啟用延遲初始化,必須將以下行新增到配置檔案:
spring.main.lazy-initialization=true
這適用於所有bean。
如果除一個(或多個)以外的所有bean需要此配置,則可以使用:@Lazy(false)。此外,如果需要使用延遲初始化配置一個特定的bean,@Lazy則應使用註釋。

如果使用@Lazy註釋了一個類,則意味著所有使用註釋的方法@Bean 都是惰性的。例如,在下面的示例中,將僅延遲載入地址getAddress()。

@Lazy
@Configuration
public class HelloWorld {
 
    @Bean
    public Address getAddress() {
        return new Address();
    }
 
    public Name getName() {
        return new Name();
    }
 
    public Company getCompany() {
        return new Company();
    }
}

如果@Lazy從類中除去,並將其新增到@Bean宣告中,則意味著延遲載入僅影響該特定的bean。

@Configuration
public class HelloWorld {
 
    @Bean
    @Lazy(true)
    public Address getAddress() {
        return new Address();
    }
 
    public Name getName() {
        return new Name();
    }
}


Kubernetes檢測
Kubernetes是Google提供的開源容器管理工具。
值得注意的是,透過在類上使用@ConditionalOnCloudPlatform,您可以檢查應用程式是否在Kubernetes上執行。

@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES)
public class DemoApplication {
    //…
}


其他新功能和效能改進包括以下:
配置屬性現在支援基於建構函式的繫結,對執行狀況指示器進行分組的能力以及Spring Boot的RSocket實現的廣泛的自配置。
RSocket是提供反應式流語義的應用程式協議。
spring-boot-starter-rsocket現在是Spring Boot啟動程式的一部分。

考慮到所有因素,我認為您絕對應該嘗試Spring Boot 2.2以便更舒適地編寫程式碼。
 

相關文章