在Spring Boot 2中有什么新內(nèi)容?

A look at new features in Spring Framework 5 & Spring Boot 2

Spring Boot 2剛剛發(fā)布,在最近的幾個月里,我很興奮地看到它不停的在更新。這個版本是17個月的工作的最高點的見證,由215個不同的人提交超過了6800次。有一些很棒的功能可以討論,讓我們來討論一下Spring Boot 2中的新特性。

在這篇文章中我們將會看到:

  • Spring Boot的歷史
  • Spring Boot中的新東西
  • Spring Boot 2 遷移指南
  • 其他的資源

Spring Boot的歷史

在我們深入看新的變化之前我們先借這個機(jī)會來了解一下Spring Boot的歷史。這篇博客在2013年8月發(fā)布,Phil Webb宣布了一個名為Spring Boot的新項目的第一個里程碑版本。

Spring Boot的目標(biāo)是使創(chuàng)建Spring驅(qū)動的、生產(chǎn)級的應(yīng)用程序和服務(wù)更加容易。它采用了Spring平臺的有主見的觀點,以便新的和現(xiàn)有的用戶能夠快速地獲得他們需要的東西。您可以使用它來創(chuàng)建獨立的Java應(yīng)用程序,可以使用“Java -jar”或更傳統(tǒng)的WAR部署開始。

大約9個月后,2014年4月,Spring Boot 1.0發(fā)布了。從那以后,已經(jīng)有無數(shù)次的小發(fā)行,給我們帶來了一些真正偉大的特性。

  • Spring Boot 1.1 (June 2014)

    • spring-boot-starter-test
    • Metrics & Health Endpoints
    • Elastic Search, Apache Solr, Spring
    • Social & Spring Integration Auto-configuration
    • Additional Templating support (Adding Freemaker, Groov, and Velocity)
  • Spring Boot 1.2 (March 2015)

    • Servlet 3.1, Tomcat 8 & Jetty 9
    • Spring 4.1
    • @SpringBootApplication Annotation
      Email Support

Spring 有什么新內(nèi)容

Spring Boot 2的新產(chǎn)品是什么?如果我們要討論最大的特性,我們需要從升級到Spring Framework 5開始。雖然Spring Framework 5自2017年9月就已經(jīng)發(fā)布了,但大多數(shù)開發(fā)人員(像我一樣)一直在等待Spring Boot 2的發(fā)布。Spring Framework 5引入了一長串的新特性,但我只是想介紹一下這里的幾個主要功能。

在Spring Framework 5中有什么新內(nèi)容!

Java 8+ 最低要求

如果您希望構(gòu)建Spring框架應(yīng)用程序,那么您必須至少使用Java 8。你的第一個想法可能是,這對我們所有人來說都是一個巨大的改變,但實際上它對Spring團(tuán)隊來說是一個更大的變化。這給了他們一個機(jī)會來進(jìn)行一些重大的更改,以更新代碼庫,以更新Java 8中的所有新特性,如Lambdas和streams。這不僅在整個代碼中具有可讀性,而且還對框架的核心提供了一些性能改進(jìn)。

支持 Java9

如果您想使用Java 9,您需要更新Spring Framework 5,因此需要更新Spring Boot 2。我知道我們很多人可能不會在生產(chǎn)中使用最新的和最偉大的Java版本,但是這是一個很好的機(jī)會,讓你可以玩所有的酷新玩具。使用標(biāo)準(zhǔn)的類路徑可以很好地完成這個工作,但是我已經(jīng)讀過一些人在遷移到Java 9模塊時遇到的問題。

Spring MVC

雖然Spring MVC并不是這個故事的主要角色,但是有一些很好的升級。我不會在這里一一講解這些內(nèi)容,因此,我將介紹 Spring Framework 5的文檔.

Spring WebFlux

在Spring Framework 5的故事中,反應(yīng)堆棧(reactive stack)是我們的主要角色。這是一種不同的思考方式,但對我們來說幸運的是,我們不需要學(xué)習(xí)一種全新的編程方式。Spring WebFlux是一種完全異步和非阻塞的web框架,它可以讓我們處理大量并發(fā)連接。這是一個完全的新的范例轉(zhuǎn)換,并且我們可以很容易的開始。


reactive_stack.png

支持Kotlin

Kotlin支持被添加到http://start.spring.io但是在Spring Framework 5中有專門的語言支持。有了專門的支持,您可以在這里看到一些不錯的特性。 read about here.

測試改進(jìn)

測試環(huán)境的最大變化是對JUnit 5JUnit 5的Jupiter編程和擴(kuò)展模型的完全支持。稍后我將再次提到這一點,但是當(dāng)您啟動一個新的Spring Boot 2應(yīng)用程序時,您仍然使用JUnit 4,但是如果您想開始使用JUnit 5,那么它是一個簡單的更改。

在Spring Boot 2中有什么新東西!

第三方庫的升級

隨著Spring Boot的任何新版本的發(fā)布,Spring團(tuán)隊有機(jī)會更新各種依賴關(guān)系。

  • Thymeleaf 3 *
  • Jetty 9.4
  • Tomcat 8.5
  • Hibernate 5.2
  • Flyway 5
  • Gradle 4
  • Thymeleaf啟動器現(xiàn)在包括了Thymeleaf -extras-java8time out of The box。

Reactive Spring Data & Spring Security

隨著Spring WebFlux的發(fā)展,Spring數(shù)據(jù)也為反應(yīng)性應(yīng)用提供了支持。目前,Cassandra、MongoDB、Couchbase和Redis都有活性API支持。Spring Boot包含了所有這些應(yīng)該讓開始變得非常簡單的starter- pom。

我們還獲得了在反應(yīng)性應(yīng)用程序中使用Spring Security 5.0的能力。當(dāng)Spring Security在類路徑上時,自動配置為WebFlux應(yīng)用程序提供。

Actuator

Spring引導(dǎo)驅(qū)動器并不是什么新東西,但是它已經(jīng)從頭開始重寫了。如果您不熟悉執(zhí)行器項目,它會自動公開端點,以獲取關(guān)于應(yīng)用程序狀態(tài)的信息。在Spring Boot 1.x中的執(zhí)行器是針對servlet API編寫的,并且伴隨著新的反應(yīng)式堆棧,Spring團(tuán)隊需要一個能夠同時處理這兩個問題的解決方案。與此同時,執(zhí)行器有許多變化:

  • Redesign for both servlet & reactive
  • Status & health (all the details) were separated out
  • Simplified Security model
  • Move to micrometer (think SLF4J but for metrics)
  • Improved JSON Structures
  • Simplified process for creating User-Defined Endpoints.
    • @Endpoint
    • @WebEndpoint
    • @JmxEndpoint

有一個專門的關(guān)于Spring Boot Actuator Web API端點的詳細(xì)文檔,這是一個很好的起點。Spring Boot Actuator Web API端點的詳細(xì)文檔 and this is a great place to start.

Gradle Plugin

我一直都是Gradle的忠實粉絲,我很高興看到團(tuán)隊利用這個機(jī)會重寫了Gradle插件。

Spring Boot Gradle插件在Gradle中提供了Spring引導(dǎo)支持,允許您打包可執(zhí)行jar或war歸檔,運行Spring引導(dǎo)應(yīng)用程序,并使用Spring - Boot依賴項提供的依賴項管理。Spring Boot的Gradle插件需要Gradle 4.0或更高版本。

Getting Started

要開始使用插件,它需要應(yīng)用到您的項目中。


buildscript {
    repositories {
        maven { url 'https://repo.spring.io/libs-milestone' }
    }

    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.RC1'
    }
}

apply plugin: 'org.springframework.boot'


構(gòu)建可執(zhí)行的jars和wars

bootRepackage任務(wù)已經(jīng)替換為bootJar和bootWar任務(wù),分別用于構(gòu)建可執(zhí)行的jar和war。這兩項任務(wù)都擴(kuò)展了它們的等效標(biāo)準(zhǔn)Gradle jar或war任務(wù),使您能夠訪問所有通常的配置選項和行為。

依賴管理

Spring Boot的Gradle插件不再自動應(yīng)用依賴管理插件。相反,Spring Boot的插件現(xiàn)在會對依賴管理插件進(jìn)行響應(yīng),導(dǎo)入正確版本的Spring - Boot依賴BOM。這使您能夠更好地控制如何以及何時配置依賴關(guān)系管理。對于大多數(shù)應(yīng)用程序來說,應(yīng)用依賴管理插件是足夠的:

apply plugin: 'io.spring.dependency-management'

Gradle插件也有自己的文檔,里面有一些非常棒的信息。任何想要開始使用Gradle的人都應(yīng)該從下面的鏈接開始。Gradle Plugin also has its own documentation

簡化安全

在Spring Boot 2.x中,主要的目標(biāo)之一是簡化安全配置,使添加自定義安全性變得容易。默認(rèn)情況下,一切都是安全的,包括靜態(tài)資源和執(zhí)行器端點。如果SSpring Security位于類路徑上,Spring Boot將添加@EnableWebSecurity,并依賴Spring Security的 content-negoation來決定使用哪種身份驗證機(jī)制。

一旦用戶決定要添加自定義安全性,Spring Boot提供的默認(rèn)安全配置將完全退出。此時,用戶需要顯式地定義他們想要保護(hù)的所有的東西。這意味著現(xiàn)在安全配置在一個地方,避免與現(xiàn)有WebSecurityConfigurerAdapters任何類型的排序問題。

下面是一個自定義security的例子:

http
    .authorizeRequests()
        // 1
        .requestMatchers(EndpointRequest.to("status", "info"))
            .permitAll()
        // 2
        .requestMatchers(EndpointRequest.toAnyEndpoint())
            .hasRole("ACTUATOR")
        // 3 
        .requestMatchers(StaticResourceRequest.toCommonLocations())
            .permitAll()
        // 4
        .antMatchers("/**")
            .hasRole("USER")
    .and()
  ... // additional configuration
  1. /status and /info 斷點不需要認(rèn)證.
  2. 所有其他應(yīng)用程序端點都受ACTUATOR角色的保護(hù)。
  3. 公共靜態(tài)資源位置對所有人開放.
  4. 所有其他應(yīng)用程序端點都受用戶USER的保護(hù)。

Actuator Security

隨著執(zhí)行器端點被鎖定,您將需要包含或排除您希望看到的端點。這些是現(xiàn)在控制的屬性,從1.x開始變化。

端點WEB配置(WebEndpointProperties)

management.endpoints.web.exposure.include=info,health # Endpoint IDs that should be included or '*' for all.
management.endpoints.web.exposure.exclude= # Endpoint IDs that should be excluded.
management.endpoints.web.base-path=/actuator # Base path for Web endpoints. Relative to server.servlet.context-path or management.server.servlet.context-path if management.server.port is configured.
management.endpoints.web.path-mapping= # Mapping between endpoint IDs and the path that should expose them.

如果您不確定使用什么屬性,多看看常用的應(yīng)用程序?qū)傩晕臋n。common application properties documentation.

支持 HTTP/2

很難相信,但是HTTP 1.1規(guī)范是在1996年發(fā)布的。我認(rèn)為這是毋庸置疑的,但是今天的網(wǎng)絡(luò)是非常不同的。如果您希望在Spring MVC或WebFlux應(yīng)用程序中啟用HTTP/2,可以使用以下屬性。

server.http2.enabled=true
這種支持取決于所選的web服務(wù)器和應(yīng)用程序環(huán)境,因為該協(xié)議不受JDK8的支持。請查看文檔以了解更多細(xì)節(jié) for more details.

Configuration Properties

在Spring Boot 1.x中。這種輕松綁定的概念得到了支持,這意味著有多種方法可以創(chuàng)建屬性名稱(駝峰、下劃線、連字符),并且該屬性將綁定到相同的屬性。

這仍然是一樣的,但是他們獲取的方式是在你自己的代碼中讀取變量的方式。@Value注釋是一個核心容器特性,它不提供與類型安全配置屬性相同的特性。

https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/boot-features-external-config.html#boot-features-external-config-relaxed-binding

Metrics

Spring Boot自己的指標(biāo)已被Micrometer
取代。 Pivotal正在開發(fā)這項服務(wù),并迅速在Pivotal內(nèi)部的項目中被采用。

Spring Boot Actuator為Micrometer提供依賴管理和自動配置,Micrometer是一個支持眾多監(jiān)控系統(tǒng)的應(yīng)用指標(biāo)外觀,其中包括:

想要學(xué)習(xí)更多關(guān)于Micrometer 瀏覽 https://micrometer.io/

這可能會給那些大量記錄自定義度量的人帶來一點升級的痛苦。

Quartz Scheduler

Spring Boot 2提供了對Quartz Scheduler的支持,它可以通過Spring - Boot -starter- Quartz專用啟動器使用。內(nèi)存和JDBC存儲都可以配置。


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

HikariCP Connection Pool

默認(rèn)連接池已從Tomcat切換到HikariCP。 如果您使用spring.datasource.type強(qiáng)制在基于Tomcat的應(yīng)用程序中使用Hikari,則現(xiàn)在可以刪除該重寫。 同樣,如果您想要保留Tomcat連接池,只需將以下內(nèi)容添加到您的配置中即可:

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

Developer Tools

默認(rèn)情況下,每次應(yīng)用程序重新啟動時,都會記錄顯示狀態(tài)評估增量的報告。報告顯示了在進(jìn)行更改(如添加或刪除bean和設(shè)置配置屬性)時對應(yīng)用程序的自動配置的更改。

若要禁用報告的日志記錄,請設(shè)置以下屬性:

spring.devtools.restart.log-condition-evaluation-delta=false

Kotlin Support

我們在之前討論過Kotlin 這里是相關(guān)的文檔 documentation to Kotlin.

JUnit 5

正如我前面所說的,Spring引導(dǎo)應(yīng)用程序的默認(rèn)值仍然是使用JUnit 4\。如果您想切換到JUnit 5,您將需要從spring引導(dǎo)啟動器測試中排除JUnit 4,并添加所需的依賴項。您還需要添加下面列出的插件。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
    <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
<groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>${junit-platform.version}</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

Spring Boot 2 Migration Guide

這可能是不言而喻的,但是像這樣的任何主要版本,僅僅是在生產(chǎn)中翻轉(zhuǎn)版本號并不是最好的升級路徑。我要做的第一件事是閱讀Spring Boot 2.0 Migration Guide。對我來說,我發(fā)現(xiàn)我的大部分問題都圍繞著簡化的安全模型變更和屬性變更。遷移指南包含了遷移您的屬性文件的一個很棒的技巧。

使用Spring Boot 2.0,許多配置屬性被重命名/刪除,開發(fā)人員需要相應(yīng)地更新其application.properties / application.yml。 為了幫助你,Spring Boot發(fā)布了一個新的spring-boot-properties-migrator模塊。 一旦作為依賴添加到項目中,這不僅將分析應(yīng)用程序的環(huán)境并在啟動時打印診斷信息,而且還會在運行時為您暫時遷移屬性。 這是您的應(yīng)用程序遷移期間必須具備的條件:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-properties-migrator</artifactId>
</dependency>

我不確定你的想法是什么,但是我肯定會開始使用Spring Boot 2并開始將代碼遷移到它,但是對于任何主要版本,我通常都會等到下一個版本發(fā)布。 這不僅僅是為了Spring,我從蘋果,Pivotal到憤怒的小鳥,都能做到這一點!

Resources

Documentation

這里有大量的資源,但我想從文檔開始。Spring框架和Spring Boot的文檔多年來確實得到了改進(jìn)。我喜歡一些專門的指南,我們這一次用Actuator和Gradle插件。

Conclusion

我期待這個版本已經(jīng)很長時間了,很興奮他的正式發(fā)布。

原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容