A look at new features in Spring Framework 5 & Spring Boot 2
Spring Boot 2剛剛發(fā)布,在最近的幾個(gè)月里购桑,我很興奮地看到它不停的在更新畅铭。這個(gè)版本是17個(gè)月的工作的最高點(diǎn)的見證,由215個(gè)不同的人提交超過(guò)了6800次勃蜘。有一些很棒的功能可以討論硕噩,讓我們來(lái)討論一下Spring Boot 2中的新特性。
在這篇文章中我們將會(huì)看到:
- Spring Boot的歷史
- Spring Boot中的新東西
- Spring Boot 2 遷移指南
- 其他的資源
Spring Boot的歷史
在我們深入看新的變化之前我們先借這個(gè)機(jī)會(huì)來(lái)了解一下Spring Boot的歷史缭贡。這篇博客在2013年8月發(fā)布炉擅,Phil Webb宣布了一個(gè)名為Spring Boot的新項(xiàng)目的第一個(gè)里程碑版本辉懒。
Spring Boot的目標(biāo)是使創(chuàng)建Spring驅(qū)動(dòng)的、生產(chǎn)級(jí)的應(yīng)用程序和服務(wù)更加容易坑资。它采用了Spring平臺(tái)的有主見的觀點(diǎn)耗帕,以便新的和現(xiàn)有的用戶能夠快速地獲得他們需要的東西。您可以使用它來(lái)創(chuàng)建獨(dú)立的Java應(yīng)用程序袱贮,可以使用“Java -jar”或更傳統(tǒng)的WAR部署開始。
大約9個(gè)月后体啰,2014年4月攒巍,Spring Boot 1.0發(fā)布了。從那以后荒勇,已經(jīng)有無(wú)數(shù)次的小發(fā)行柒莉,給我們帶來(lái)了一些真正偉大的特性。
-
- 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)
-
- Servlet 3.1, Tomcat 8 & Jetty 9
- Spring 4.1
- @SpringBootApplication Annotation
Email Support
-
Spring Boot 1.3 (December 2016)
- Upgrade to Spring Framework 4.2
- Upgrade to Spring Security 4.0
- Developer Tools
- Caching Auto-configuration
- Fully executable JARs and service support
-
Spring Boot 1.4 (January 2017)
- Spring 4.3
- Hibernate 5
- Testing Improvements
- Integration Starter
- Couchbase and Neo4J Support
-
Spring Boot 1.5 (February 2017)
- Loggers endpoint
- Apache Kafka support
- Cloud Foundry actuator extensions
- LDAP support
- Testing updates
Spring 有什么新內(nèi)容
Spring Boot 2的新產(chǎn)品是什么?如果我們要討論最大的特性沽翔,我們需要從升級(jí)到Spring Framework 5開始兢孝。雖然Spring Framework 5自2017年9月就已經(jīng)發(fā)布了,但大多數(shù)開發(fā)人員(像我一樣)一直在等待Spring Boot 2的發(fā)布仅偎。Spring Framework 5引入了一長(zhǎng)串的新特性跨蟹,但我只是想介紹一下這里的幾個(gè)主要功能。
在Spring Framework 5中有什么新內(nèi)容!
Java 8+ 最低要求
如果您希望構(gòu)建Spring框架應(yīng)用程序橘沥,那么您必須至少使用Java 8窗轩。你的第一個(gè)想法可能是,這對(duì)我們所有人來(lái)說(shuō)都是一個(gè)巨大的改變座咆,但實(shí)際上它對(duì)Spring團(tuán)隊(duì)來(lái)說(shuō)是一個(gè)更大的變化痢艺。這給了他們一個(gè)機(jī)會(huì)來(lái)進(jìn)行一些重大的更改,以更新代碼庫(kù)介陶,以更新Java 8中的所有新特性堤舒,如Lambdas和streams。這不僅在整個(gè)代碼中具有可讀性哺呜,而且還對(duì)框架的核心提供了一些性能改進(jìn)舌缤。
支持 Java9
如果您想使用Java 9,您需要更新Spring Framework 5弦牡,因此需要更新Spring Boot 2谱姓。我知道我們很多人可能不會(huì)在生產(chǎn)中使用最新的和最偉大的Java版本,但是這是一個(gè)很好的機(jī)會(huì)缚态,讓你可以玩所有的酷新玩具白华。使用標(biāo)準(zhǔn)的類路徑可以很好地完成這個(gè)工作,但是我已經(jīng)讀過(guò)一些人在遷移到Java 9模塊時(shí)遇到的問(wèn)題椭豫。
Spring MVC
雖然Spring MVC并不是這個(gè)故事的主要角色耻瑟,但是有一些很好的升級(jí)旨指。我不會(huì)在這里一一講解這些內(nèi)容,因此喳整,我將介紹 Spring Framework 5的文檔.
Spring WebFlux
在Spring Framework 5的故事中谆构,反應(yīng)堆棧(reactive stack)是我們的主要角色。這是一種不同的思考方式框都,但對(duì)我們來(lái)說(shuō)幸運(yùn)的是搬素,我們不需要學(xué)習(xí)一種全新的編程方式。Spring WebFlux是一種完全異步和非阻塞的web框架魏保,它可以讓我們處理大量并發(fā)連接熬尺。這是一個(gè)完全的新的范例轉(zhuǎn)換,并且我們可以很容易的開始谓罗。
支持Kotlin
Kotlin支持被添加到http://start.spring.io但是在Spring Framework 5中有專門的語(yǔ)言支持粱哼。有了專門的支持,您可以在這里看到一些不錯(cuò)的特性檩咱。 read about here.
測(cè)試改進(jìn)
測(cè)試環(huán)境的最大變化是對(duì)JUnit 5JUnit 5的Jupiter編程和擴(kuò)展模型的完全支持揭措。稍后我將再次提到這一點(diǎn),但是當(dāng)您啟動(dòng)一個(gè)新的Spring Boot 2應(yīng)用程序時(shí)刻蚯,您仍然使用JUnit 4绊含,但是如果您想開始使用JUnit 5,那么它是一個(gè)簡(jiǎn)單的更改芦倒。
在Spring Boot 2中有什么新東西!
第三方庫(kù)的升級(jí)
隨著Spring Boot的任何新版本的發(fā)布艺挪,Spring團(tuán)隊(duì)有機(jī)會(huì)更新各種依賴關(guān)系。
- Thymeleaf 3 *
- Jetty 9.4
- Tomcat 8.5
- Hibernate 5.2
- Flyway 5
- Gradle 4
- Thymeleaf啟動(dòng)器現(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)該讓開始變得非常簡(jiǎn)單的starter- pom疆瑰。
我們還獲得了在反應(yīng)性應(yīng)用程序中使用Spring Security 5.0的能力。當(dāng)Spring Security在類路徑上時(shí)昙啄,自動(dòng)配置為WebFlux應(yīng)用程序提供穆役。
Actuator
Spring引導(dǎo)驅(qū)動(dòng)器并不是什么新東西,但是它已經(jīng)從頭開始重寫了梳凛。如果您不熟悉執(zhí)行器項(xiàng)目耿币,它會(huì)自動(dòng)公開端點(diǎn),以獲取關(guān)于應(yīng)用程序狀態(tài)的信息韧拒。在Spring Boot 1.x中的執(zhí)行器是針對(duì)servlet API編寫的淹接,并且伴隨著新的反應(yīng)式堆棧十性,Spring團(tuán)隊(duì)需要一個(gè)能夠同時(shí)處理這兩個(gè)問(wèn)題的解決方案。與此同時(shí)塑悼,執(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
有一個(gè)專門的關(guān)于Spring Boot Actuator Web API端點(diǎn)的詳細(xì)文檔劲适,這是一個(gè)很好的起點(diǎn)。Spring Boot Actuator Web API端點(diǎn)的詳細(xì)文檔 and this is a great place to start.
Gradle Plugin
我一直都是Gradle的忠實(shí)粉絲厢蒜,我很高興看到團(tuán)隊(duì)利用這個(gè)機(jī)會(huì)重寫了Gradle插件霞势。
Spring Boot Gradle插件在Gradle中提供了Spring引導(dǎo)支持,允許您打包可執(zhí)行jar或war歸檔斑鸦,運(yùn)行Spring引導(dǎo)應(yīng)用程序支示,并使用Spring - Boot依賴項(xiàng)提供的依賴項(xiàng)管理。Spring Boot的Gradle插件需要Gradle 4.0或更高版本鄙才。
Getting Started
要開始使用插件,它需要應(yīng)用到您的項(xià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。這兩項(xiàng)任務(wù)都擴(kuò)展了它們的等效標(biāo)準(zhǔn)Gradle jar或war任務(wù)败晴,使您能夠訪問(wèn)所有通常的配置選項(xiàng)和行為浓冒。
依賴管理
Spring Boot的Gradle插件不再自動(dòng)應(yīng)用依賴管理插件。相反尖坤,Spring Boot的插件現(xiàn)在會(huì)對(duì)依賴管理插件進(jìn)行響應(yīng)稳懒,導(dǎo)入正確版本的Spring - Boot依賴BOM。這使您能夠更好地控制如何以及何時(shí)配置依賴關(guān)系管理慢味。對(duì)于大多數(shù)應(yīng)用程序來(lái)說(shuō)场梆,應(yīng)用依賴管理插件是足夠的:
apply plugin: 'io.spring.dependency-management'
Gradle插件也有自己的文檔,里面有一些非常棒的信息纯路。任何想要開始使用Gradle的人都應(yīng)該從下面的鏈接開始或油。Gradle Plugin also has its own documentation
簡(jiǎn)化安全
在Spring Boot 2.x中,主要的目標(biāo)之一是簡(jiǎn)化安全配置驰唬,使添加自定義安全性變得容易顶岸。默認(rèn)情況下,一切都是安全的叫编,包括靜態(tài)資源和執(zhí)行器端點(diǎn)辖佣。如果SSpring Security位于類路徑上,Spring Boot將添加@EnableWebSecurity
搓逾,并依賴Spring Security的 content-negoation來(lái)決定使用哪種身份驗(yàn)證機(jī)制卷谈。
一旦用戶決定要添加自定義安全性,Spring Boot提供的默認(rèn)安全配置將完全退出恃逻。此時(shí)雏搂,用戶需要顯式地定義他們想要保護(hù)的所有的東西藕施。這意味著現(xiàn)在安全配置在一個(gè)地方,避免與現(xiàn)有WebSecurityConfigurerAdapters任何類型的排序問(wèn)題。
下面是一個(gè)自定義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
- /status and /info 斷點(diǎn)不需要認(rèn)證.
- 所有其他應(yīng)用程序端點(diǎn)都受ACTUATOR角色的保護(hù)凸郑。
- 公共靜態(tài)資源位置對(duì)所有人開放.
- 所有其他應(yīng)用程序端點(diǎn)都受用戶USER的保護(hù)裳食。
Actuator Security
隨著執(zhí)行器端點(diǎn)被鎖定,您將需要包含或排除您希望看到的端點(diǎn)芙沥。這些是現(xiàn)在控制的屬性诲祸,從1.x開始變化。
端點(diǎn)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)境,因?yàn)樵搮f(xié)議不受JDK8的支持心铃。請(qǐng)查看文檔以了解更多細(xì)節(jié) for more details.
Configuration Properties
在Spring Boot 1.x中准谚。這種輕松綁定的概念得到了支持,這意味著有多種方法可以創(chuàng)建屬性名稱(駝峰去扣、下劃線柱衔、連字符),并且該屬性將綁定到相同的屬性愉棱。
這仍然是一樣的唆铐,但是他們獲取的方式是在你自己的代碼中讀取變量的方式。@Value注釋是一個(gè)核心容器特性羽氮,它不提供與類型安全配置屬性相同的特性或链。
Metrics
Spring Boot自己的指標(biāo)已被Micrometer
取代。 Pivotal正在開發(fā)這項(xiàng)服務(wù)档押,并迅速在Pivotal內(nèi)部的項(xiàng)目中被采用澳盐。
Spring Boot Actuator為Micrometer提供依賴管理和自動(dòng)配置,Micrometer是一個(gè)支持眾多監(jiān)控系統(tǒng)的應(yīng)用指標(biāo)外觀令宿,其中包括:
- Atlas
- Datadog
- Ganglia
- Graphite
- Influx
- JMX
- New Relic
- Prometheus
- SignalFx
- Simple (in-memory)
- StatsD
-
Wavefront
想要學(xué)習(xí)更多關(guān)于Micrometer 瀏覽 https://micrometer.io/
這可能會(huì)給那些大量記錄自定義度量的人帶來(lái)一點(diǎn)升級(jí)的痛苦叼耙。
Quartz Scheduler
Spring Boot 2提供了對(duì)Quartz Scheduler的支持,它可以通過(guò)Spring - Boot -starter- Quartz專用啟動(dòng)器使用粒没。內(nèi)存和JDBC存儲(chǔ)都可以配置筛婉。
<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)用程序重新啟動(dòng)時(shí)哨毁,都會(huì)記錄顯示狀態(tài)評(píng)估增量的報(bào)告。報(bào)告顯示了在進(jìn)行更改(如添加或刪除bean和設(shè)置配置屬性)時(shí)對(duì)應(yīng)用程序的自動(dòng)配置的更改源武。
若要禁用報(bào)告的日志記錄扼褪,請(qǐng)?jiān)O(shè)置以下屬性:
spring.devtools.restart.log-condition-evaluation-delta=false
Kotlin Support
我們?cè)谥坝懻撨^(guò)Kotlin 這里是相關(guān)的文檔 documentation to Kotlin.
JUnit 5
正如我前面所說(shuō)的,Spring引導(dǎo)應(yīng)用程序的默認(rèn)值仍然是使用JUnit 4\粱栖。如果您想切換到JUnit 5话浇,您將需要從spring引導(dǎo)啟動(dòng)器測(cè)試中排除JUnit 4,并添加所需的依賴項(xiàng)闹究。您還需要添加下面列出的插件幔崖。
<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)版本號(hào)并不是最好的升級(jí)路徑岖瑰。我要做的第一件事是閱讀Spring Boot 2.0 Migration Guide。對(duì)我來(lái)說(shuō)砂代,我發(fā)現(xiàn)我的大部分問(wèn)題都圍繞著簡(jiǎn)化的安全模型變更和屬性變更。遷移指南包含了遷移您的屬性文件的一個(gè)很棒的技巧率挣。
使用Spring Boot 2.0刻伊,許多配置屬性被重命名/刪除,開發(fā)人員需要相應(yīng)地更新其application.properties / application.yml椒功。 為了幫助你捶箱,Spring Boot發(fā)布了一個(gè)新的spring-boot-properties-migrator模塊。 一旦作為依賴添加到項(xiàng)目中动漾,這不僅將分析應(yīng)用程序的環(huán)境并在啟動(dòng)時(shí)打印診斷信息丁屎,而且還會(huì)在運(yùn)行時(shí)為您暫時(shí)遷移屬性。 這是您的應(yīng)用程序遷移期間必須具備的條件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
</dependency>
我不確定你的想法是什么旱眯,但是我肯定會(huì)開始使用Spring Boot 2并開始將代碼遷移到它晨川,但是對(duì)于任何主要版本,我通常都會(huì)等到下一個(gè)版本發(fā)布删豺。 這不僅僅是為了Spring共虑,我從蘋果,Pivotal到憤怒的小鳥呀页,都能做到這一點(diǎn)妈拌!
Resources
Documentation
這里有大量的資源,但我想從文檔開始蓬蝶。Spring框架和Spring Boot的文檔多年來(lái)確實(shí)得到了改進(jìn)尘分。我喜歡一些專門的指南猜惋,我們這一次用Actuator和Gradle插件。
- Spring Boot Reference Guide: https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/
- Spring Boot API: https://docs.spring.io/spring-boot/docs/2.0.x/api/
- Spring Boot Actuator Web API: https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/
- Spring Boot Gradle Plugin Reference: https://docs.spring.io/spring-boot/docs/2.0.x/gradle-plugin/reference/html/
- Spring Boot Maven Plugin Reference: https://docs.spring.io/spring-boot/docs/2.0.x/maven-plugin/
- Common Application Properties: https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/common-application-properties.html
Conclusion
我期待這個(gè)版本已經(jīng)很長(zhǎng)時(shí)間了培愁,很興奮他的正式發(fā)布著摔。