[TOC]html
前言
在談SpringBoot 2.x 以前,先來聊點別的:java
首先是Java 語言,這門長期佔據編程語言排行榜首位的語言到底有什麼魔力? 你們的見解是多種多樣的,好比:git
- 面向對象設計,使用簡單,能夠很快速的入門;
- 開源生態作得好,不少可重用的組件,拿來即用;
- 跨平臺,高性能,是作後臺開發的首選
還有一種觀點頗有意思:這是命好,每當人們以爲 Java 不行了的時候,總會有英雄橫刀救美..github
其中,主要說的是:web
":最初 Java 開發出來不知道有什麼用的時候,發現能夠用 Applet 在網頁上作動畫。 後來企業級軟件開發時代 JavaEE 大行其道,開源社區 Spring 桃李滿天下。 等到了移動時代,人們以爲 Java 要完蛋了,Google 拍馬救市,收購併開放了 Android 平臺,當家語言就是 Java。 因而 Java 再次煥發勃勃生機。 目前在大數據領域,Java 一樣是當仁不讓的好手。"redis
原文出自這裏,感興趣的朋友能夠去讀一讀。spring
**"命好"**的確沒錯,但這裏想說的是開放性(開源)是很是關鍵的。 因爲Java的開放性,其開源生態衍生出了很是多的優秀框架,其中最有表明性的就是SpringFramework。 隨着框架的受衆愈來愈多,該項目也在持續演進以知足日益增加的能力需求,最終你們便愈來愈離不開它。 到現在 SpringFramework 已經造成了一個龐大的生態圈,同時 Spring Web也已經成爲Java開發的一種"事實標準"。mongodb
若是但願瞭解Spring 框架的一些歷史,推薦讀一讀 是時候給你們介紹 Spring Boot/Cloud 背後豪華的研發團隊了 這篇文章。數據庫
1、SpringBoot 簡史
SpringBoot 的誕生不是沒有道理的,可能你們都清楚,Spring Framework定義了一個核心的概念叫IoC,即控制反轉。 這是什麼意思? 控制反轉,即對象的關係再也不由對象自己決定,由容器來控制其依賴。簡單說,就是由容器來幫你初始化對象,並完成自動化的關聯。 這樣,又有了依賴注入(Dependency Injection)的概念...總之,IoC 和 DI是 理解Spring框架的關鍵,後面全部出現的東西,都是從這兩個概念開始的。apache
而後,由於要作自動化的對象初始化、關係裝配,須要有個東西來描述這些關係,通常是用xml文件來描述,好比applicationContext.xml 會描述一個ApplicationContext上下文裏面所擁有的對象實例,以及這些實例之間的關係。 因而乎,全部的 Spring 應用程序都使用了這樣的配置方式。
在 Web 開發方面,Spring Framework誕生了 Spring MVC,用來簡化 Servlet的開發。 經過AOP實現的路由轉換能力,能夠快速的把URL映射到一個Bean方法去處理;經過內置經常使用的編解碼轉換器,能夠避免每次都要寫格式轉換的代碼.. 這些能力,也讓 Spring MVC 稱爲了Java Web開發框架的不二之選。
可是發展到了後來,隨着 Web開發技術的逐步完善,一個框架集成的模塊愈來愈多,而單一Web應用的功能特性也愈來愈多了。 此時你們逐漸發現,基於 xml的方式去定義Bean加載,工做量其實很大,並且配置文件逐漸變得臃腫、很差維護,有時候配置出現錯誤,常常是要排查個半天。 因而乎都用了@Bean、@Autowired註解,還有@ComponentScan 來實現自動化掃描,這些特性大大簡化了開發工做。
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都有哪些更新,要不要作升級?
圖-Spring之父 Rod Johnson
2、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 內部也對一些功能點進行了有必要的響應式升級,最值得注意的是對內嵌式容器的支持。
對響應式編程支持又包括如下幾個技術模塊。
- Spring WebFlux & WebFlux.fn 支持
- 響應式 Spring Data 支持
- 響應式 Spring Security 支持
- 內嵌式的 Netty 服務器支持
5.Data 支持
上面有說到對響應式 Spring Data 的支持,除此以外,其餘 Data 模塊也作了許多更新和提高,具體體如今如下幾個地方。
- 2.x 默認使用 HikariCP 鏈接池;
- 更加合理化的優化了數據庫初始化邏輯;
- spring.jdbc.template 自動配置如今能夠經過 spring.jdbc.template 屬性定製;
- 提供了新配置 spring.jdbc.template 方便分頁和排序;
- 對數據庫 spring.jdbc.template 自動化配置支持;
- 能夠高級定製 MongoDB 客戶端;
- 能夠經過 spring.cache.redis.* 來配置 Redis 緩存默認值。
6.Web增強
除了上面說了 2.x 對響應式框架的支持,還包括如下幾個 web 開發改進。
- 使用內嵌式容器時,context path 會和端口一塊兒記錄並打印出來;
- 全部支持的容器都支持過濾器的初始化;
- Thymeleaf 開始支持 javax.time 類型;
- 提供了一個 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 中,對測試模塊有了一些調整,如自動化的配置加強。
在這裏,能夠看到更詳細的的版本特性。
3、要不要升級
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篇" ,期待更多精彩內容^-^