天天看點

SpringBoot 2 要不要更新

[TOC]

前言

在談SpringBoot 2.x 之前,先來聊點别的:

首先是Java 語言,這門長期占據程式設計語言排行榜首位的語言到底有什麼魔力?

大家的看法是多種多樣的,比如:

  • 面向對象設計,使用簡單,可以很快速的入門;
  • 開源生态做得好,很多可重用的元件,拿來即用;
  • 跨平台,高性能,是做背景開發的首選

還有一種觀點很有意思:這是命好,每當人們覺得 Java 不行了的時候,總會有英雄橫刀救美..

SpringBoot 2 要不要更新

其中,主要說的是:

":最初 Java 開發出來不知道有什麼用的時候,發現可以用 Applet 在網頁上做動畫。

後來企業級軟體開發時代 JavaEE 大行其道,開源社群 Spring 桃李滿天下。

等到了移動時代,人們覺得 Java 要完蛋了,Google 拍馬救市,收購并開放了 Android 平台,當家語言就是 Java。

于是 Java 再次煥發勃勃生機。 目前在大資料領域,Java 同樣是當仁不讓的好手。"

原文

出自這裡

,感興趣的朋友可以去讀一讀。

"命好"的确沒錯,但這裡想說的是開放性(開源)是非常關鍵的。

由于Java的開放性,其開源生态衍生出了非常多的優秀架構,其中最有代表性的就是SpringFramework。

随着架構的閱聽人越來越多,該項目也在持續演進以滿足日益增長的能力需求,最終大家便越來越離不開它。

到如今 SpringFramework 已經形成了一個龐大的生态圈,同時 Spring Web也已經成為Java開發的一種"事實标準"。

SpringBoot 2 要不要更新

如果希望了解Spring 架構的一些曆史,推薦讀一讀

是時候給大家介紹 Spring Boot/Cloud 背後豪華的研發團隊了

這篇文章。

一、SpringBoot 簡史

SpringBoot 的誕生不是沒有道理的,可能大家都清楚,Spring Framework定義了一個核心的概念叫IoC,即控制反轉。 這是什麼意思?

控制反轉,即對象的關系不再由對象本身決定,由容器來控制其依賴。簡單說,就是由容器來幫你初始化對象,并完成自動化的關聯。

這樣,又有了依賴注入(Dependency Injection)的概念...總之,IoC 和 DI是 了解Spring架構的關鍵,後面所有出現的東西,都是從這兩個概念開始的。

然後,因為要做自動化的對象初始化、關系裝配,需要有個東西來描述這些關系,一般是用xml檔案來描述,比如applicationContext.xml 會描述一個ApplicationContext上下文裡面所擁有的對象執行個體,以及這些執行個體之間的關系。 于是乎,所有的 Spring 應用程式都使用了這樣的配置方式。

在 Web 開發方面,Spring Framework誕生了 Spring MVC,用來簡化 Servlet的開發。 通過AOP實作的路由轉換能力,可以快速的把URL映射到一個Bean方法去處理;通過内置常用的編解碼轉換器,可以避免每次都要寫格式轉換的代碼.. 這些能力,也讓 Spring MVC 稱為了Java Web開發架構的不二之選。

SpringBoot 2 要不要更新

但是發展到了後來,随着 Web開發技術的逐漸完善,一個架構內建的子產品越來越多,而單一Web應用的功能特性也越來越多了。 此時大家逐漸發現,基于 xml的方式去定義Bean加載,工作量其實很大,而且配置檔案逐漸變得臃腫、不好維護,有時候配置出現錯誤,經常是要排查個半天。 于是乎都用了@Bean、@Autowired注解,還有@ComponentScan 來實作自動化掃描,這些特性大大簡化了開發工作。

SpringBoot 2 要不要更新

SpringBoot 是基于免配置的思路來設計的,也就是說讓你不用在配置上花太多時間,所有的東西盡可能都用内置的、現成的。

于是乎,就有了各種各樣的 starter 子項目,嚴格說,這些 starter 隻能算是膠水項目(幾乎沒有代碼),但是它們能讓你獲得許多開發上的愉悅體驗!

下面的這些starter都具備不同的用途:

  • spring-boot-starter

     核心啟動器,包含了自動配置、日志和YAML。

  • spring-boot-starter-web

     引入全棧式Web開發元件,包括Tomcat和spring-webmvc

  • spring-boot-starter-thymeleaf

     引入Thymeleaf模闆引擎,包括與Spring的內建。

  • spring-boot-starter-test

     引入正常的測試依賴,包括JUnit、Hamcrest、Mockito以及spring-test子產品。

  • spring-boot-starter-websocket

     引入WebSocket子產品

  • spring-boot-starter-redis

     引入Redis子產品

  • spring-boot-starter-security

     引入 spring-security安全子產品

  • spring-boot-starter-data-jpa

     引入資料存儲層JPA(Java Persistence API)

  • spring-boot-starter-data-mongodb

     引入MongoDB資料庫子產品

  • spring-boot-starter-amqp

     引入spring-rabbitmq用戶端來支援AMQP協定

  • spring-boot-starter-aop

     引入AOP的程式設計子產品,包括spring-aop和AspectJ

  • spring-boot-starter-mail

     引入javax.mail子產品

  • spring-boot-starter-log4j

     引入Log4J日志架構

同時,這些子產品化項目是随着SpringBoot版本一起演進的。

2014年4月份,Spring Boot 剛釋出了 1.0版本 便 迅速圈粉,接下來1.x 版本經曆了4年的演進;

直到2018年3月份,Spring Boot 2.0版本釋出,

下面,是SpringBoot經曆過的一些版本:

Spring boot 1.1(2014 年 6 月)

改進的模闆支援,gemfire 支援,elasticsearch 和 apache solr 的自動配置。

Spring Boot 1.2(2015 年 3 月)

更新到 servlet 3.1 / tomcat 8 / jetty 9,spring 4.1 更新,

支援 banner / jms / SpringBootApplication 注解。

Spring Boot 1.3(2016 年 12 月)

更新到 Spring 4.2 ,新的 spring-boot-devtools,

緩存子產品實作自動化配置(ehcache,hazelcast,redis 和 infinispan)

支援完全可執行的 jar 支援。

Spring Boot 1.4(2017年1月)

spring 4.3 更新,支援 couchbase/neo4j,分析啟動失敗和RestTemplateBuilder。

Spring Boot 1.5(2017年2月)

支援 kafka / ldap,第三方庫更新,棄用 crash 支援和執行器記錄器端點以動态修改應用程式日志級别。

Spring Boot 2.0(2018 年 03 月)

基于 Java 8,支援 Java 9,支援 Quartz ,排程程式大大簡化了安全自動配置,支援嵌入式 Netty。

Spring Boot 2.1(2018 年 10 月)

支援 Java 11,更新Spring 5.1,應用性能提升,度量子產品做了改進。

其中 Spring Boot 2.0跨度較大,醞釀期也達到1年之多,整個 底層的SpringCore 核心都做了較大的更新(基于Spring 5.0)。

随着 SpringBoot 2.1的釋出,2.2即将面世,整個2.0 版本也會趨于穩定。

其中,對于大多數人比較關心的,是Spring Boot 2都有哪些更新,要不要做更新?

SpringBoot 2 要不要更新

圖-Spring之父 Rod Johnson

二、SpringBoot 2 的變化

下面列舉了Spring Boot 2.0這個重要版本的一些更新:

1.配置的變更

在 2.x 中廢除了一些 1.x 中的配置,并增加了許多新配置,詳細請檢視以下連結中的變更表格。

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Configuration-Changelog

此外,關于配置的綁定方式也有些變化:

在 1.x 中,配置綁定是通過注解 @ConfigurationProperties 來注入到 Spring 環境變量中的。

在 2.x 中,配置綁定功能有了些的改造,在調整了 1.x 中許多不一緻地方之外,還提供了獨立于注解之外的 API 來裝配配置屬性。

并增加了屬性來源,這樣你就能知道這些屬性是從哪個配置檔案中加載進來的。

2.JDK 版本更新

2.x 至少需要 JDK 8 的支援,2.x 裡面的許多方法應用了 JDK 8 的許多進階新特性,是以更新到 2.0 版本必須先确認你的應用必須相容 JDK 8。

另外是 2.x 開始了對 JDK 9 的支援。

3.第三方類庫更新

2.x 對第三方類庫更新了所有能更新的穩定版本,一些值得關注的類庫:

1) Spring Framework 5+

2) Tomcat 8.5+

3) Flyway 5+

4) Hibernate 5.2+

5) Thymeleaf 3+

4.響應式程式設計支援

2.x 通過啟動器和自動配置全面支援 Spring 的響應式程式設計,響應式程式設計是完全異步和非阻塞的,它是基于事件驅動模型,而不是傳統的線程模型。

就連 Spring Boot 内部也對一些功能點進行了有必要的響應式更新,最值得注意的是對内嵌式容器的支援。

對響應式程式設計支援又包括以下幾個技術子產品。

1) Spring WebFlux & WebFlux.fn 支援

2) 響應式 Spring Data 支援

3) 響應式 Spring Security 支援

4) 内嵌式的 Netty 伺服器支援

5.Data 支援

上面有說到對響應式 Spring Data 的支援,除此之外,其他 Data 子產品也做了許多更新和提升,具體展現在以下幾個地方。

1) 2.x 預設使用 HikariCP 連接配接池;

2) 更加合理化的優化了資料庫初始化邏輯;

3) spring.jdbc.template 自動配置現在可以通過 spring.jdbc.template 屬性定制;

4) 提供了新配置 spring.jdbc.template 友善分頁和排序;

5) 對資料庫 spring.jdbc.template 自動化配置支援;

6) 可以進階定制 MongoDB 用戶端;

7) 可以通過 spring.cache.redis.* 來配置 Redis 緩存預設值。

6.Web加強

除了上面說了 2.x 對響應式架構的支援,還包括以下幾個 web 開發改進。

1) 使用内嵌式容器時,context path 會和端口一起記錄并列印出來;

2) 所有支援的容器都支援過濾器的初始化;

3) Thymeleaf 開始支援 javax.time 類型;

4) 提供了一個 spring-boot-starter-json 啟動器對 JSON 讀寫的支援。

7.HTTP/2 支援

提供對HTTP/2 的支援,如:Tomcat, Undertow, Jetty,這個得依賴具體選擇的應用伺服器和應用環境。

8.其他增強

出了前面的一些變化,還包括以下的一些增強:

Actuator加強

在 2.x 中,對執行器端點進行了許多改進,所有的 HTTP 執行端點現在都暴露在 /actuator路徑下,并對 JSON 結果集也做了改善。

Gradle 插件

Spring Boot的 Gradle 插件全面重寫了,并且最小支援 Gradle 4+ 以便提供一些重要的特性提升。

Kotlin

2.x 開始提供對 Kotlin 1.2 的支援,并且提供了一個 runApplication 函數來運作 Spring Boot 應用。

Quartz支援

2.x 提供了一個 spring-boot-starter-quartz 啟動器對定時任務架構 Quartz 的支援。

測試支援

在 2.x 中,對測試子產品有了一些調整,如自動化的配置增強。

在這裡

,可以看到更詳細的的版本特性。

三、要不要更新

Spring Boot 2.0 釋出至今已經将近一年了,目前來看應該是比較穩定的,而市面上也出現不少基于 SpringBoot 2.0的教程書籍,在這個時間點開始使用是沒有問題的。

A. 如果所在的團隊較小,或是對于新的項目,建議可以直接上手;

B. 對于規模較大,或是已經上線一段時間的項目,則需要考慮如下問題:

  • 目前的Spring Boot版本是否存在重大的缺陷?
  • 切換過程産生的人力成本是否可以接受?
  • 團隊中對于新版本的掌握程度如何?

對于後者,我更多建議持保守态度,Spring Boot 1.x 盡管目前已經停止更新,但其經曆了4年多的疊代完善,目前是使用面最廣且最為穩定的。

如果确實想進行更新,也建議先做好的分析及測試,也可以看看

SpringBoot 2.0遷移指南

作為初學者來看,使用 Spring Boot 1.x 還是 2.x 的差別并不大,相比較之下,當下在使用 1.x過程中遇到的一些問題會更容易找到答案。

或許,你可以從下面這篇文章開始學習 Spring Boot。

springboot項目基礎搭建課

歡迎繼續關注"美碼師的補習系列-springboot篇" ,期待更多精彩内容^-^