Spring Boot 介紹

Spring Boot 是由 Pivotal 團隊提供的全新框架,其設計目的是用來簡化新 Spring 應用的初始搭建以及開發過程,該框架使用了特定的方式來進行配置,從而使開發人員再也不須要定義樣板化的配置。Spring Boot 默認配置了不少框架的使用方式,就像 Maven 整合了全部的 Jar 包,Spring Boot 整合了全部的框架。它的核心設計思想是:約定優於配置,Spring Boot 全部開發細節都是依據此思想進行實現的。java

Spring Boot 是一套全新的框架,它來自於 Spring 你們族,所以 Spring 全部具有的功能它都有而且更容易使用;同時還簡化了基於 Spring 的應用開發,經過少許的代碼就能建立一個獨立的、產品級別的 Spring 應用。 git

下圖展現出了 Spring Boot 在 Spring 生態中的位置:github

該項目主要的目的是:web

  • 上手 Spring 開發更快、更普遍;
  • 使用默認方式實現快速開發;
  • 提供大多數項目所需的非功能特性,諸如:嵌入式服務器、安全、心跳檢查、外部配置等。

Spring Boot 特性redis

  • 使用 Spring 項目引導頁面能夠在幾秒構建一個項目;
  • 方便對外輸出各類形式的服務,如 REST API、WebSocket、Web、Streaming、Tasks;
  • 很是簡潔的安全策略集成;
  • 支持關係數據庫和非關係數據庫;
  • 支持運行期內嵌容器,如 Tomcat、Jetty;
  • 強大的開發包,支持熱啓動;
  • 自動管理依賴;
  • 自帶應用監控;
  • 支持各類 IED,如 IntelliJ IDEA、NetBeans。

1.1.1    Spring Boot 市場熱度

Spring Boot 於 2014 年發佈了第一個正式版本,發佈以後陸續有一些開源愛好者進行了研究,並迅速喜歡上了這款開源軟件,Spring Boot 在初期低調快速發展,直到 2016 年才被真正使用起來。期間不少研究 Spring Boot 的開發者,在網上寫了大量文章,推進了 Spring Boot 在行業內的發展。spring

從 2016 年到 2018 年,是 Spring Boot 在中國發展的黃金時期,使用 Spring Boot 的企業和我的開發者愈來愈多,咱們從 Spring Boot 關鍵字的百度指數能夠看出。mongodb

 

上圖爲 2014 年到 2018 年 Spring Boot 的百度指數,能夠看出 2.0 的推出引起了搜索高峯。數據庫

經過谷歌趨勢來看 Spring Boot 在美國的使用狀況發現,中國和美國使用 Spring Boot 的總體頻率保持一致,看來國內技術人同步全球的技術頻率愈來愈快。apache

 

看到社區使用 Spring Boot 的熱情,Spring 官方也很是重視 Spring Boot 的後續發展,已經把它做爲公司最頂級的項目來推廣,放到了官網上第一的位置,後續 Spring Boot 的發展也被看好。編程

 

1.1.2    Spring Boot 和微服務架構

微服務架構是在互聯網高速發展,技術突飛猛進的變化以及傳統架構沒法適應快速變化等多重因素的推進下誕生的產物。互聯網時代的產品一般有兩類特色:需求變化快和用戶羣體龐大。在這種狀況下,如何從系統架構的角度出發,構建靈活、易擴展的系統,快速應對需求的變化;在用戶增長的同時如何保證系統的可伸縮性、高可用性,成爲系統架構面臨的挑戰。

若是還按照之前傳統開發模式,開發一個大而全的系統已經很難知足市場對技術的需求,這時候分而治之的思想被提了出來,因而咱們從單獨架構發展到分佈式架構,又從分佈式架構發展到 SOA 架構,服務不斷地被拆分和分解,粒度也愈來愈小,直到微服務架構的誕生。

大約 2009 年開始,Netflix 徹底從新定義了它的應用程序開發和操做模型,拉開了微服務探索的第一步,直到 2014 年 3 月 Martin Fowler 寫的一篇文章 Microservices 以更加通俗易懂的形式爲你們定義了什麼是微服務架構。Martin Fowler 在文中闡述了對微服務架構的設想,認爲微服務架構是一種架構模式,它提倡將單一應用程序劃分紅一組小的服務,服務之間互相協調、互相配合,爲用戶提供最終價值。

Spring Boot 誕生時,正處於微服務概念在慢慢醞釀中,Spring Boot 的研發融合了微服務架構的理念,實現了在 Java 領域內微服務架構落地的技術支撐。Spring Boot 在開發、測試、部署、運維等方面都作了大量的優化,使用 Spring Boot 開發項目,能夠快速響應需求、獨立完成開發部署上線。

Spring Boot 的一系列特性有助於實現微服務架構的落地,從目前衆多的技術棧對比來看它是 Java 領域微服務架構最優落地技術,沒有之一。

1.1.3    爲何學習 Spring Boot ?

《精通 Spring Boot 42 講》

Spring Boot 自己並不提供 Spring 框架的核心特性以及擴展功能,只是用於快速、敏捷地開發新一代基於 Spring 框架的應用程序。同時它集成了大量經常使用的第三方庫配置(如 Redis、MongoDB、JPA、RabbitMQ、Quartz 等),Spring Boot 應用中這些第三方庫幾乎能夠零配置進行開箱即用,大部分的 Spring Boot 應用都只須要很是少許的配置代碼,開發者可以更加專一於業務邏輯。

使用 Spring Boot 開發項目,有如下幾方面優點:

  • Spring Boot 使開發變得簡單,提供了豐富的解決方案,快速集成各類解決方案提高開發效率。
  • Spring Boot 使配置變得簡單,提供了豐富的 Starters,集成主流開源產品每每只須要簡單的配置便可。
  • Spring Boot 使部署變得簡單,其自己內嵌啓動容器,僅僅須要一個命令便可啓動項目,結合 Jenkins、Docker 自動化運維很是容易實現。
  • Spring Boot 使監控變得簡單,自帶監控組件,使用 Actuator 輕鬆監控服務各項狀態。

從軟件發展的角度來說,越簡單的開發模式越流行,簡單的開發模式解放出更多生產力,讓開發人員能夠避免將精力耗費在各類配置、語法所設置的門檻上,從而更專一於業務。這點上,Spring Boot 已儘量地簡化了應用開發的門檻。

Spring Boot 所集成的技術棧,涵蓋了各大互聯網公司的主流技術,跟着 Spring Boot 的路線去學習,基本能夠了解國內外互聯網公司的技術特色。 

1.1.4    總結

Spring Boot 是一套快速開發框架,在微服務架構的大環境下 Spring Boot 一經推出就受到開源社區的追捧。Spring Boot 有強大的生態整合能力,提供了衆多的 Starters 包,很是方便 Spring Boot 集成第三方開源軟件達到開箱即用的效果。

Spring Boot 和微服務架構都是將來軟件開發的大趨勢,越早參與,受益越大。

1.2 第1-1課:Spring Boot 產生的背景和它的設計理念

《精通 Spring Boot 42 講》共分五大部分,第一部分是從零起步的基礎內容,共4課,幫助你們快速認識 Spring Boot ,我會帶領你們熟悉 Spring Boot 產生的背景和設計理念,同時也會講解 Spring Boot 的環境搭建和項目介紹,最後以一個 Hello World 爲例,來測試一下環境的搭建以及熟悉開發的流程。本章的重點內容是 Spring Boot 2.0 的新變化,若是學習過此前課程的同窗能夠重點關注這一節。下面咱們就具體進入第一講的內容。

要了解 Spring Boot 產生的背景,咱們就必需要先了解一下 Spring 的發展史,不只由於 Spring Boot 來源於 Spring 體系,並且 Spring Boot 的誕生和 Spring 框架的發展息息相關。

1.2.1    Spring 的發展史

時間回到 2002 年,當時正是 Java EE 和 EJB 大行其道的時候,不少知名公司都是採用此技術方案進行項目開發。這時候有一個美國的小夥子認爲 EJB 太過臃腫,並非全部的項目都須要使用 EJB 這種大型框架,應該會有一種更好的方案來解決這個問題。

他爲了證實本身的想法是正確的,在 2002 年 10 月寫了一本書《Expert One-on-One J2EE》,介紹了當時 Java 企業應用程序開發的狀況,並指出了 Java EE 和 EJB 組件框架中存在的一些主要缺陷。在這本書中,他提出了一個基於普通 Java 類和依賴注入的更簡單的解決方案。

在書中,他展現瞭如何在不使用 EJB 的狀況下構建高質量、可擴展的在線座位預留系統。爲了構建應用程序,他編寫了超過 30,000 行的基礎結構代碼,項目中的根包命名爲 com.interface21,因此人們最初稱這套開源框架爲 interface21,這就是 Spring 的前身。

他是誰呢?他就是大名鼎鼎的 Rod Johnson(下圖),Rod Johnson 在悉尼大學不只得到了計算機學位,同時還得到了音樂學位,更使人吃驚的是在回到軟件開發領域以前,他還得到了音樂學的博士學位。如今 Rod Johnson 已經離開了 Spring,成爲了一個天使投資人,同時也是多個公司的董事,早已走上人生巔峯。

 

在這本書發佈後,一對一的 J2EE 設計和開發一炮而紅。這本書免費提供的大部分基礎架構代碼都是高度可重用的。2003 年 Rod Johnson 和同伴在此框架的基礎上開發了一個全新的框架命名爲 Spring,據 Rod Johnson 介紹 Spring 是傳統 J2EE 新的開始,隨後 Spring 發展進入快車道。

  • 2004 年 03 月,1.0 版發佈。
  • 2006 年 10 月,2.0 版發佈。
  • 2007 年 11 月,改名爲 SpringSource,同時發佈了 Spring 2.5。
  • 2009 年 12 月,Spring 3.0 發佈。
  • 2013 年 12 月,Pivotal 宣佈發佈 Spring 框架 4.0。
  • 2017 年 09 月,Spring 5.0 發佈。

1.2.2    Spring Boot 的誕生

多年以來,Spring 平臺飽受非議的一點就是大量的 XML 配置以及複雜的依賴管理。

隨着使用 Spring 進行開發的我的和企業愈來愈多,Spring 也慢慢從一個單一簡潔的小框架變成一個大而全的開源軟件,Spring 的邊界不斷進行擴充,到了後來 Spring 幾乎能夠作任何事情,市面上主流的開源軟件、中間件都有 Spring 對應組件支持,人們在享用 Spring 的便利以後,也遇到了一些問題。

Spring 每集成一個開源軟件,就須要增長一些基礎配置,隨着開發項目的逐漸龐大,每每須要集成不少開源軟件。後期使用 Spring 開發大型項目須要引入不少配置文件,致使配置工做難以理解且出錯率高,到了後來人們甚至稱 Spring 爲配置地獄。

在 2013 年的 SpringOne 2GX 會議上,Pivotal 的 CTO Adrian Colyer 迴應了這些批評,而且特別提到該平臺未來的目標之一就是實現免 XML 配置的開發體驗。Spring Boot 所實現的功能超出了這個任務的描述,開發人員不只再也不須要編寫 XML,並且在一些場景中甚至不須要編寫繁瑣的 import 語句。

2013 年,微服務的概念也慢慢興起,快速開發微小獨立的應用變得更爲急迫,Spring 恰好處在這樣一個交叉點上,於 2013 年初啓動了 Spring Boot 項目的研發。2014 年,Spring Boot 伴隨着 Spring 4.0 誕生髮布了第一個正式版本。

Spring Boot 並非要成爲 Spring 平臺裏面衆多「Foundation」層項目的替代者。Spring Boot 的目標不在於爲已解決的問題域提供新的解決方案,而是爲平臺帶來另外一種開發體驗,從而簡化對這些已有技術的使用。對於已經熟悉 Spring 生態系統的開發人員來講,Spring Boot 是一個很理想的選擇;對於採用 Spring 技術的新人來講,Spring Boot 提供一種更簡潔的方式來使用這些技術。

1.2.3    Spring Boot 開發團隊

咱們常常會看到在介紹 Spring Boot 的時候有這麼一句:Spring Boot 是由 Pivotal 團隊提供的全新框架。由此咱們得知 Spring Boot 是由 Pivotal 團隊所研發,那麼 Pivotal 團隊究竟是一個什麼樣的團隊呢?其實這裏的 Pivotal 團隊是指 Pivotal 公司。

Pivotal 公司:致力於「改變世界構造軟件的方式(We are transforming how the world builds software)」,提供雲原生應用開發 PaaS 平臺及服務,幫助企業客戶採用敏捷軟件開發方法論,從而提升軟件開發人員工做效率、減小運維成本,實現數字化轉型、IT 創新,並最終實現業務創新。

Pivotal 公司可謂是大牛雲集,公司的開源產品有:Spring 以及 Spring 衍生產品、Web 服務器 Tomcat、緩存中間件 Redis、消息中間件 RabbitMQ、平臺即服務的 Cloud Foundry、Greenplum 數據引擎、還有大名鼎鼎的 GemFire(12306 系統解決方案組件之一)。這些著名開源產品背後的開發者都在 Pivotal 公司,其研發團隊聚集了全球的一流開發者,Spring Boot 爲何如此優秀,或許在這裏能夠找到一些答案。

回顧 Pivotal 公司的發展歷史,簡直就是一場商業併購大片:

  • 1989 年,羅伯·米創立 Pivotal Labs 公司,它的主營業務是幫助客戶開發軟件,曾給谷歌、Twitter 公司作技術支持;
  • 2003 年,EMC 收購了 VMware;
  • 2009 年,VMware 收購了 Spring 公司;
  • 2012 年,EMC 以現金方式收購了 Pivotal Labs 公司; 
  • 2013 年,EMC 和 VMware 分拆出其 Cloud Foundry、Pivotal Labs、Greenplum 等雲計算、大數據資源,GE 投資 1.05 億美圓,成立新公司 Pivotal;
  • 2015 年,EMC 又被 DELL 所收購。

Pivotal 公司成立以後,於 2014 年發佈了 Spring Boot,2015 年發佈了 Spring Cloud,2018 年 Pivotal 公司在紐約上市。咱們能夠經過一張圖來了解 Pivotal 公司的發展史。

 

《精通 Spring Boot 42 講》

1.2.4    Spring Boot 的核心:約定優於配置

那麼什麼是約定優於配置呢?

約定優於配置(Convention Over Configuration),也稱做按約定編程,是一種軟件設計範式,旨在減小軟件開發人員需作決定的數量、得到簡單的好處,而又不失靈活性。

本質是說,開發人員僅需規定應用中不符約定的部分。例如,若是模型中有個名爲 User 的類,那麼數據庫中對應的表就會默認命名爲 user。只有在偏離這一約定時,例如將該表命名爲「user_info」,才需寫有關這個名字的配置。

咱們能夠按照這個思路來設想,咱們約定 Controller 層就是 Web 請求層能夠省略 MVC 的配置;咱們約定在 Service 結尾的類自動注入事務,就能夠省略了 Spring 的切面事務配置。

在 Spring 體系中,Spring Boot JPA 就是約定優於配置最佳實現之一,不須要關注表結構,咱們約定類名便是表名,屬性名便是表的字段,String 對應 varchar,long 對應 bigint,只有須要一些特殊要求的屬性,咱們再單獨進行配置,按照這個約定咱們能夠將之前的工做大大簡化。

Spring Boot 體系將約定優於配置的思想展示得淋漓盡致,小到配置文件、中間件的默認配置,大到內置容器、生態中的各類 Starters 無不遵循此設計規則。Spring Boot 鼓勵各軟件組織方建立本身的 Starter,建立 Starter 的核心組件之一就是 autoconfigure 模塊,也是 Starter 的核心功能,在啓動的時候進行自動裝配,屬性默認化配置。

能夠說正是由於 Spring Boot 簡化的配置和衆多的 Starters 才讓 Spring Boot 變得簡單、易用、快速上手,也能夠說正是約定優於配置的思想完全落地才讓 Spring Boot 走向輝煌。Spring Boot 約定優於配置的思想讓 Spring Boot 項目很是容易上手,讓編程變得更簡單,其實編程本該很簡單,簡單纔是編程的美。 

1.2.5    Starters

Spring Boot Starters 基於約定優於配置的理念來設計,Spring Boot Starter 中有兩個核心組件:自動配置代碼和提供自動配置模塊及其它有用的依賴。也就意味着當咱們項目中引入某個 Starter,即擁有了此軟件的默認使用能力,除非咱們須要特定的配置,通常狀況下我僅須要少許的配置或者不配置便可使用組件對應的功能。

Spring Boot 由衆多 Starter 組成,隨着版本的推移 Starter 家族成員也與日俱增。在傳統 Maven 項目中一般將一些層、組件拆分爲模塊來管理,以便相互依賴複用,在 Spring Boot 項目中咱們則能夠建立自定義 Spring Boot Starter 來達成該目的。

Spring Boot 擁有強大融合社區開源軟件的能力,在沒有使用 Spring Boot 以前,咱們須要按照每一個開源軟件的特性,將對應的組件包集成到咱們的開發項目中,由於每一個組件的設計理念和開發團隊都不一致,所以會有不少不一樣的調用風格在咱們的項目中。

Spring Boot 整合了主流的開源軟件造成了一系列的 Starter,讓咱們有了一致的編程體驗來集成各類軟件,Spring Boot 在集成的時候作了大量的優化,讓咱們在集成的時候每每只須要不多的配置和代碼就能夠完成。能夠說各類 Starters 就是 Spring Boot 最大的優點之一。

如下爲經常使用的 Spring Boot Starter 列表。

名稱

描述

Pom

spring-boot-starter

核心 Starter,包括自動配置支持,日誌和 YAML

Pom

spring-boot-starter-activemq

用於使用 Apache ActiveMQ 實現 JMS 消息

Pom

spring-boot-starter-amqp

用於使用 Spring AMQP 和 Rabbit MQ

Pom

spring-boot-starter-cache

用於使用 Spring 框架的緩存支持

Pom

spring-boot-starter-data-elasticsearch

用於使用 ElasticSearch 搜索,分析引擎和 Spring Data ElasticSearch

Pom

spring-boot-starter-data-jpa

用於使用 Hibernate 實現 Spring Data JPA

Pom

spring-boot-starter-data-mongodb

用於使用基於文檔的數據庫 MongoDB 和 Spring Data MongoDB

Pom

spring-boot-starter-data-redis

用於使用 Spring Data Redis 和 Jedis 客戶端操做鍵—值數據存儲 Redis

Pom

spring-boot-starter-jta-atomikos

用於使用 Atomikos 實現 JTA 事務

Pom

sring-boot-starter-mail

用於使用 Java Mail 和 Spring 框架 Email 發送支持

Pom

spring-boot-starter-quartz

用於定時任務 Quartz 的支持

Pom

spring-boot-starter-security

對 Spring Security 的支持

Pom

spring-boot-starter-test

用於測試 Spring Boot 應用,支持經常使用測試類庫,包括 JUnit、Hamcrest 和 Mockito

Pom

spring-boot-starter-thymeleaf

用於使用 Thymeleaf 模板引擎構建 MVC Web 應用

Pom

spring-boot-starter-validation

用於使用 Hibernate Validator 實現 Java Bean 校驗

Pom

spring-boot-starter-web

用於使用 Spring MVC 構建 Web 應用,包括 RESTful。Tomcat 是默認的內嵌容器

Pom

spring-boot-starter-websocket

用於使用 Spring 框架的 WebSocket 支持構建 WebSocket 應用

Pom

這裏只節選了咱們最常使用的 Starter,完整的 Starter 參考這裏:Spring Boot application starters

由於 Spring Boot 足夠的強大,不少第三方社區都進行了主動的集成。好比:MyBatis、RabbitMQ(高級用法)等,第三方社區支持的列表,能夠在這裏查看 Community Contributions,能夠看到社區貢獻的其餘 Starters 列表。

看完這些 Starters 會不會瞬間以爲 Spring Boot 很強大?幾乎咱們涉及的開源軟件 Spring Boot 都作了支持,在 Spring Boot 環境下使用這些軟件,只須要引入對應的 Starter 包便可。

1.2.6    Spring、Spring Boot 和 Spring Cloud 的關係

Spring 最初核心的兩大核心功能 Spring IoC 和 Spring Aop 成就了 Spring,Spring 在這兩大核心功能上不斷地發展,纔有了 Spring 事務、Spring MVC 等一系列偉大的產品,最終成就了 Spring 帝國,到了後期 Spring 幾乎能夠解決企業開發中的全部問題。

Spring Boot 是在強大的 Spring 帝國生態基礎上面發展而來,發明 Spring Boot 不是爲了取代 Spring,是爲了讓人們更容易的使用 Spring。因此說沒有 Spring 強大的功能和生態,就不會有後期 Spring Boot 的火熱,Spring Boot 使用約定優於配置的理念,從新重構了 Spring 的使用,讓 Spring 後續的發展更有生命力。

Spring 並無重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,經過 Spring Boot 風格進行再封裝並屏蔽掉複雜的配置和實現原理,最終給開發者提供了一套簡單易懂、易部署、易維護的分佈式系統開發工具包。

Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性巧妙地簡化了分佈式系統基礎設施的開發。服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,均可以用 Spring Boot 的開發風格作到一鍵啓動和部署。

Spring Cloud 是爲了解決微服務架構中服務治理而提供的具有一系列功能的開發框架,而且 Spring Cloud 是徹底基於 Spring Boot 而開發,Spring Cloud 利用 Spring Boot 特性整合了開源行業中優秀的組件,總體對外提供了一套在微服務架構中服務治理的解決方案。

綜上咱們能夠這樣來理解,正是因爲 Spring IoC 和 Spring Aop 兩個強大的功能纔有了 Spring,Spring 生態不斷的發展纔有了 Spring Boot,使用 Spring Boot 讓 Spring 更易用更有生命力,Spring Cloud 是基於 Spring Boot 開發的一套微服務架構下的服務治理方案。

如下爲它們之間的關係。

Spring Ioc/Aop > Spring > Spring Boot > Spring Cloud

1.2.7    總結

Spring Boot 誕生一方面是由於 Spring 自身發展所遇到的問題,另外一方面在微服務思想誕生之際,急須要一款快速開發工具來實現微服務技術落地,在這樣的背景下誕生了 Spring Boot。

Spring Boot 總體的設計思想是:約定優於配置。依賴此設計思路,Spring Boot 進行了大刀闊斧的改革,讓開發、測試、部署更爲便捷。衆多的 Starters 成就了 Spring Boot 的發展,讓使用 Spring Boot 開發項目變得更加簡單。

1.3 第1-2課:Spring Boot 2.0 都更新了什麼(上)

2018 年 3 月 1 號 Spring Boot 2.0.0.RELEASE 正式發佈,這是 Spring Boot 1.0 發佈 4 年以後第一次重大修訂,所以有多新功能和特性值得關注!在 Spring Boot 官方博客中咱們瞭解到:Spring Boot 2.0 版本經歷了 17 個月的開發,有 215 個不一樣的使用者提供了超過 6800 次的提交。

咱們將 Spring Boot 2.0 更新的技術分爲三類進行解讀:

  • 第一類,基礎環境升級;
  • 第二類,默認軟件替換和優化;
  • 第三類,新技術的引入。

1.3.1    基礎環境升級

1.3.1.1 最低 JDK 8,支持 JDK 9,再也不支持 Java 6 和 7

Spring Boot 2.0 要求 Java 8 做爲最低版本,許多現有的 API 已更新,以利用 Java 8 的特性。例如,接口上的默認方法,函數回調以及新的 API,如 javax.time。若是你正在使用 Java 7 或更早版本,則在開發 Spring Boot 2.0 應用程序以前,須要升級你的 JDK。

Spring Boot 2.0 經過測試能夠在 JDK 9 下正常運行,同時 Spring Boot 2.0 宣佈再也不支持 Java 6 和 7,據我瞭解國內絕大部分互聯網公司的基本環境還在 JDK 7 或者 6 環境下運行,考慮升級 Spring Boot 2.0 的團隊須要考慮這個因素。

1.3.1.2 依賴組件升級

Spring Boot 2.0 基於 Spring Framework 5 構建,本次 Spring Boot 的升級,同時也升級了部分其依賴的第三方組件,主要有如下幾個:

  • Jetty 9.4,Jetty 是一個開源的 Servlet 容器,它爲基於 Java 的 Web 內容,例如 JSP 和 Servlet 提供運行環境。Jetty 是使用 Java 語言編寫的,它的 API 以一組 JAR 包的形式發佈。
  • Tomcat 8.5,Apache Tomcat 8.5.x 旨在取代 8.0.x,徹底支持 Java 9。
  • Flyway 5,Flyway 是獨立於數據庫的應用、管理並跟蹤數據庫變動的數據庫版本管理工具。用通俗的話講,Flyway 能夠像 SVN 管理不一樣人的代碼那樣,管理不一樣人的 SQL 腳本,從而作到數據庫同步。
  • Hibernate 5.2,Hibernate 是一款很是流行的 ORM 框架。
  • Gradle 3.4,Spring Boot 的 Gradle 插件在很大程度上已被重寫,有了重大的改進。
  • Thymeleaf 3.0,Thymeleaf 3 相對於 Thymeleaf 2 有很是大的性能提高。

1.3.2    默認軟件替換和優化

1.3.2.1 HikariCP

默認鏈接池已從 Tomcat 切換到 HikariCP,HikariCP 是一個高性能的 JDBC 鏈接池,Hikari 是日語「光」的意思。

HikariCP 號稱是 Java 業界最快的數據庫鏈接池,官網提供了 c3p0、dbcp二、tomcat、vibur 和 Hikari 等數據鏈接池的性能對比。

 

關於 Hikari 性能爲何如此突出,官網給出的說明以下:

  • 字節碼精簡:優化代碼,直到編譯後的字節碼最少,這樣 CPU 緩存能夠加載更多的程序代碼;
  • 優化代理和攔截器:減小代碼,例如 HikariCP 的 Statement proxy 只有 100 行代碼;
  • 自定義數組類型(FastStatementList)代替 ArrayList:避免每次 get() 調用都要進行 range check,避免調用 remove() 時從頭至尾的掃描;
  • 自定義集合類型(ConcurrentBag):提升併發讀寫的效率;
  • 其餘針對 BoneCP 缺陷的優化,好比對於耗時超過一個 CPU 時間片的方法調用的研究。

1.3.2.2 Security

Spring Security 是 Spring 社區的一個頂級項目,也是 Spring Boot 官方推薦使用的 Security 框架。除了常規的 Authentication 和 Authorization 以外,Spring Security 還提供了諸如 ACLs、LDAP、JAAS、CAS 等高級特性以知足複雜場景下的安全需求。

沒有使用 Spring Boot 以前集成起來相對比較麻煩,而 Spring Boot 中基於 Java 配置實現 Spring Security 功能。Spring Boot 2.0 極大地簡化了默認的安全配置,並使添加定製安全變得簡單。

Spring Boot 2.0 很是容易使用 Spring Security 5.0 保護響應式應用,當檢測到 Spring Security 存在的時候會自動進行默認配置。

1.3.2.3 OAuth 2.0

OAuth 2.0 是 OAuth 協議的延續版本,但不向後兼容 OAuth 1.0,即徹底廢止了 OAuth1.0。OAuth 2.0 關注客戶端開發者的簡易性。要麼經過組織在資源擁有者和 HTTP 服務商之間的被批准的交互動做表明用戶,要麼容許第三方應用表明用戶得到訪問的權限。

OAuth 2.0 是一個受權框架,或稱受權標準,它可使第三方應用程序或客戶端得到對 HTTP 服務上(如 Google、GitHub )用戶賬戶信息的有限訪問權限。OAuth 2.0 經過將用戶身份驗證委派給託管用戶賬戶的服務以及受權客戶端訪問用戶賬戶進行工做。

Spring Boot 2.0 將 Spring Security OAuth 項目遷移到 Spring Security。再也不提供單獨的依賴包,Spring Boot 2.0 經過 Spring Security 5 提供 OAuth 2.0 客戶端支持。

1.3.2.4 Micrometer

Micrometer 是一款監控指標的度量類庫,可讓你在沒有供應商鎖定的狀況下對 JVM 的應用程序代碼進行調整。

Spring Boot 2.0 加強了對 Micrometer 的集成,再也不提供本身的指標 API。依靠 micrometer.io 來知足全部應用程序監視需求。

Micrometer 包括尺寸指標的支持,當與尺寸監測系統配對時,尺寸指標能夠有效訪問特定的指定度量標準,而且能夠在其尺寸範圍內向下鑽取。

指標能夠輸出到各類系統和開箱即用的 Spring Boot 2.0,爲 Atlas、Datadog、Ganglia、Graphite、Influx、JMX、New Relic、Prometheus、SignalFx、StatsD 和 Wavefront 提供支持,另外還可使用簡單的內存中度量標準。

集成後提供 JVM 指標(包括 CPU、內存、線程和 GC)、Logback、Tomcat、Spring MVC & 提供 RestTemplate。

1.3.2.5 Redis 默認使用 Lettuce

Redis 方面默認引入了 Lettuce,替代了以前的 Jedis 做爲底層的 Redis 鏈接方式。

Lettuce 是一個可伸縮的線程安全的 Redis 客戶端,用於同步、異步和反應使用。多個線程能夠共享同一個 RedisConnection,它利用優秀 Netty NIO 框架來高效地管理多個鏈接,支持先進的 Redis 功能,如 Sentinel、集羣、流水線、自動從新鏈接和 Redis 數據模型。

國內使用 Jedis 的居多,看來之後要多研究 Lettuce 了。

1.3.2.6 配置屬性綁定

在 Spring Boot 2.0 中,使用 Environment 綁定機制的 @ConfigurationProperties 數學已經徹底完全修改。藉此機會收緊了綁定的規則,並修復了 Spring Boot 1.x 中的許多不一致之處。

新的 Binder API 也能夠直接使用 @ConfigurationProperties 在代碼中。例如,下面綁定 List 中的 PersonName 對象:

List<PersonName> people = Binder.get(environment)
"my.property"class    .bind(, Bindable.listOf(PersonName.))
new    .orElseThrow(IllegalStateException::);

配置源能夠像這樣在 YAML 中表示:

my:
  property:
  - first-name: Jane
last   -name: Doe
  - first-name: John
last   -name: Doe
1.3.2.6.1    轉換器支持

Binding 使用了一個新的 ApplicationConversionService 類,它提供了一些額外有用的轉化。最引人注目的是轉換器的 Duration 類型和分隔字符串。

該 Duration 轉換器容許在任一 ISO-8601 格式的持續時間,或是一個簡單的字符串(如 10m,10 分鐘)。現有的屬性已更改成默認使用 Duration,該 @DurationUnit 註釋經過設置若是沒有指定所使用的單元確保向後兼容性。例如,Spring Boot 1.5 中須要秒數的屬性如今必須 @DurationUnit(ChronoUnit.SECONDS) 確保一個簡單的值,例如 10 實際使用的值爲 10s。

分隔字符串轉換容許你將簡單綁定 String 到 Collection 或 Array 沒必要分割逗號。例如,LDAP base-dn屬性用 @Delimiter(Delimiter.NONE),因此 LDAP DN(一般包含逗號)不會被錯誤解釋。

1.3.2.7 Actuator 改進

在 Spring Boot 2.0 中 Actuator endpoints 有很大的改進,全部 HTTP Actuator endpoints 如今都在該/actuator路徑下公開,而且生成的 JSON 有效負載獲得了改進。

如今默認狀況下不會暴露不少端點。若是你要從 Spring Boot 1.5 升級現有的應用,請務必查看遷移指南並特別注意該 management.endpoints.web.exposure.include 屬性。

Spring Boot 2.0 改進了從許多端點返回的 JSON 有效負載。

如今許多端點都具備更精確地反映底層數據的 JSON。例如,/actuator/conditions終端(/autoconfig在 Spring Boot 1.5 中)如今有一個頂級 contexts 密鑰來將結果分組 ApplicationContext。

1.3.2.8 測試

對 Spring Boot 2.0 中測試進行了一些補充和調整:

  • @WebFluxTest 已添加新註釋以支持 WebFlux 應用程序的「slice」測試。
  • Converter 和 GenericConverter beans 如今自動掃描 @WebMvcTest 和 @WebFluxTest。
  • @AutoConfigureWebTestClient 已經添加到 WebTestClient 供測試使用,這個註釋會自動應用於 @WebFluxTest 測試。
  • 增長了一個新的 ApplicationContextRunner 測試實用程序,能夠很容易地測試你的自動配置,咱們已將大部份內部測試套件移至此新模型。

1.3.2.9 其餘

還有一些小的調整和改進:

  • @ConditionalOnBean 如今在肯定是否知足條件時使用邏輯 AND 而不是邏輯 OR。
  • 無條件類如今包含在自動配置中。
  • 該 spring CLI 應用程序如今包括 encodepassword 可用於建立 Spring Security 的兼容散列密碼命令。
  • 計劃任務(即 @EnableScheduling)可使用 scheduledtasks 執行器端點進行審查。
  • 該 loggers 驅動器終端如今容許你從新設置一個日誌的默認級別。
  • Spring Session 用戶如今能夠經過 sessions 執行器端點查找和刪除會話。
  • 使用 spring-boot-starter-parent 如今基於 Maven 的應用程序-parameters默認使用標誌。

1.3.3    新技術的引入

1.3.3.1 支持 HTTP/2

HTTP/2 是第二代的 HTTP 協議,Spring Boot 的 Web 容器選擇中 Tomcat,Undertow 和 Jetty 均已支持 HTTP/2。

相比 HTTP/1.x,HTTP/2 在底層傳輸作了很大的改動和優化:

  • HTTP/2 採用二進制格式傳輸數據,而非 HTTP/1.x 的文本格式。二進制格式在協議的解析和優化擴展上帶來更多的優點和可能。
  • HTTP/2 對消息頭採用 HPACK 進行壓縮傳輸,可以節省消息頭佔用的網絡的流量;而 HTTP/1.x 每次請求,都會攜帶大量冗餘頭信息,浪費了不少帶寬資源;頭壓縮可以很好的解決該問題。
  • 多路複用,直白的說就是全部的請求都是經過一個 TCP 鏈接併發完成。HTTP/1.x 雖然經過 pipeline 也能併發請求,可是多個請求之間的響應會被阻塞的,因此 pipeline 至今也沒有被普及應用,而 HTTP/2 作到了真正的併發請求。同時,流還支持優先級和流量控制。
  • Server Push:服務端可以更快的把資源推送給客戶端。例如,服務端能夠主動把 JS 和 CSS 文件推送給客戶端,而不須要客戶端解析 HTML 再發送這些請求,當客戶端須要的時候,它已經在客戶端了。

1.3.3.2 嵌入式 Netty 服務器

因爲 WebFlux 不依賴於 Servlet API,咱們如今能夠首次爲 Netty 做爲嵌入式服務器提供支持,該 spring-boot-starter-webflux 啓動 POM 將拉取 Netty 4.1 和 Ractor Netty。

注意:你只能將 Netty 用做反應式服務器,不提供阻止 Servlet API 支持。

1.3.3.3 Kotlin的支持

Spring Boot 2.0 如今包含對 Kotlin 1.2.x 的支持,並提供了 runApplication,一個使用 Kotlin 運行 Spring Boot 應用程序的方法。咱們還公開和利用了 Kotlin 對其餘 Spring 項目(如 Spring Framework,Spring Data 和 Reactor)已添加到其最近版本中的支持。

1.3.3.4 JOOQ 的支持

JOOQ 是基於 Java 訪問關係型數據庫的工具包。JOOQ 既吸收了傳統 ORM 操做數據的簡單性和安全性,又保留了原生 SQL 的靈活性,它更像是介於 ORMS 和 JDBC 的中間層。對於喜歡寫 SQL 的碼農來講,JOOQ 能夠徹底知足你控制慾,能夠是用 Java 代碼寫出 SQL 的感受來。

1.3.3.5 支持 Quartz

Spring Boot 1.0 並無提供對 Quartz 的支持,以前出現了各類集成方案,Spring Boot2.0 給出了最簡單的集成方式。

1.3.3.6 響應式編程

WebFlux 模塊的名稱是 spring-webflux,名稱中的 Flux 來源於 Reactor 中的類 Flux。Spring WebFlux 有一個全新的非堵塞的函數式 Reactive Web 框架,能夠用來構建異步的、非堵塞的、事件驅動的服務,在伸縮性方面表現很是好。

非阻塞的關鍵預期好處是可以以小的固定數量的線程和較少的內存進行擴展。在服務器端 WebFlux 支持兩種不一樣的編程模型:

  • 基於註解的 @Controller 和其餘註解也支持 Spring MVC;
  • Functional 、Java 8 Lambda 風格的路由和處理。

 

默認狀況下,Spring Boot 2.0 使用 Netty WebFlux,由於 Netty 在異步非阻塞空間中被普遍使用,異步非阻塞鏈接能夠節省更多的資源,提供更高的響應度。經過比較 Servlet 3.1 非阻塞 I/O 沒有太多的使用,由於使用它的成本比較高,Spring WebFlux 打開了一條實用的通路。

使用 Spring WebFlux/WebFlux.fn 提供響應式 Web 編程支持,WebFlux 是一個全新的非堵塞的函數式 Reactive Web 框架,能夠用來構建異步的、非堵塞的、事件驅動的服務,在伸縮性方面表現很是好,此功能來源於 Spring 5.0。

Spring Boot 2.0 也提供了對響應式編程的自動化配置,如 Reactive Spring Data、Reactive Spring Security 等。

點擊瞭解《精通 Spring Boot 42 講》

最後,Spring Boot 2.0 的新技術還有一個有意思的彩蛋設計,咱們會再下一講介紹。同時,我會詳細解釋一下 Spring Boot 1.0 到 Spring Boot 2.0 API 上的一些變化,以及關因而否須要升級 Spring Boot 的我的建議。

1.4 第1-2課:Spring Boot 2.0 都更新了什麼(下)

1.4.1.1 彩蛋

Spring Boot 2.0 支持了動態 Gif 的啓動 Logo 打印。

在 Spring Boot 1.0 項目中 src/main/resources 路徑下新建一個 banner.txt 文件,文件中寫入一些字符,啓動項目時就會發現默認的 Banner 被替換了,到了 Spring Boot 2.0 如今能夠支持 Gif 文件的打印,Spring Boot 2.0 在項目啓動的時候,會將 Gif 圖片的每個畫面,按照順序打印在日誌中,全部的畫面打印完畢後,纔會啓動 Spring Boot 項目。

 

    

項目的啓動 Banner 有什麼用呢,在一些大的組織或者公司中,能夠利用這個特性定製本身專屬的啓動畫面,增長團隊對品牌的認同感。

1.4.2    1.0 升級 2.0 API 變化

從 Spring Boot 1.0 升級到 2.0 以後,有不少的 API 已通過時,在使用的時候須要注意。

1.4.2.1 啓動類 SpringBootServletInitializer

Spring Boot 部署到 Tomcat 中去啓動時須要在啓動類添加 SpringBootServletInitializer,2.0 和 1.0 有區別。

// 1.0
importorg.springframework.boot.web.support.SpringBootServletInitializer;
// 2.0
importorg.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 
@SpringBootApplication
publicclass UserManageApplication extends SpringBootServletInitializer {
@Override   
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)    {
return       application.sources(UserManageApplication.class);
    }
 
public static void main(String[] args) throws Exception    {
        SpringApplication.run(UserManageApplication.class, args);
    }
}

Spring Boot 2.0 默認不包含 log4j,建議使用 slf4j。

importorg.apache.log4j.Logger;
protectedthisLogger logger = Logger.getLogger(.getClass());

改成:

importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
protectedthisLogger logger =  LoggerFactory.getLogger(.getClass());

1.4.2.2 Thymeleaf 3.0 默認不包含佈局模塊

Spring Boot 2.0 中 spring-boot-starter-thymeleaf 包默認並不包含佈局模塊,使用 Thymeleaf 對頁面進行佈局時,須要單獨添加布局模塊,以下:

<dependency>
<groupId></groupId>  nz.net.ultraq.thymeleaf
<artifactId></artifactId>  thymeleaf-layout-dialect
</dependency>

layout:decorator 標籤在 3.0 過時,推薦使用新的標籤 layout:decorate 進行頁面佈局。

1.4.2.3 配置文件

大量的 Servlet 專屬的 server.* 被移到了 server.servlet.* 下:

Old property

New property

server.context-parameters.*

server.servlet.context-parameters.*

server.context-path

server.servlet.context-path

server.jsp.class-name

server.servlet.jsp.class-name

server.jsp.init-parameters.*

server.servlet.jsp.init-parameters.*

server.jsp.registered

server.servlet.jsp.registered

server.servlet-path

server.servlet.path

原 spring.http.* 或 spring.server.* 下的一些參數,例如我用到了文件上傳參數,已修改成 sping.servlet.multipart 下。

1.4.2.4 WebMvcConfigurerAdapter 過時

Spring Boot 2.0 中將原來的 WebMvcConfigurerAdapter 替換爲 WebMvcConfigurer。

1.0 中的用法:

class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapterpublic

2.0 中的用法:

publicclass MyWebMvcConfigurerAdapter implements WebMvcConfigurer

1.4.2.5 Spring Boot JPA 變化

去掉了 xxxOne() 方法

之前的 findOne() 方法其實就是根據傳入的 ID 來查找對象,因此在 Spring Boot 2.0 的 Repository 中咱們能夠添加 findById(long id) 來替換使用。

例如:

Useruser=userRepository.findOne(Long id)

改成手動在 userRepository 手動添加 findById(long id) 方法,使用時將 findOne() 調用改成 findById(long id):

longidUser user=userRepository.findById()

delete() 方法和 findOne() 相似也被去掉了,可使用 deleteById(Long id) 來替換,還有一個不一樣點是 deleteById(Long id) 默認實現返回值爲 void。

Long deleteById(Long id);

改成:

deletevoid//改成類型
voidLongiddeleteById();

固然咱們還有一種方案能夠解決上述的兩種變化,就是自定義 SQL(以下),可是沒有上述方案簡單,不建議使用。

@Query"select t from Tag t where t.tagId = :tagId"()
Tag getByTagId(@Param("tagId") long tagId);

須要指定主鍵的自增策略

Spring Boot 2.0 須要指定主鍵的自增策略,這個和 Spring Boot 1.0 有所區別,1.0 會使用默認的策略,若是不指定自增策略會報錯。

@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
privatelongid;

分頁組件 PageRequest 變化

在 Spring Boot 2.0 中 ,方法 new PageRequest(page, size, sort) 已通過期再也不推薦使用,推薦使用如下方式來構建分頁信息:

ofby"id"Pageable pageable =PageRequest.(page, size, Sort.(Sort.Direction.ASC,));

跟蹤了一下源碼發現 PageRequest.of() 方法,內部仍是使用的 new PageRequest(page, size, sort),只是最新的寫法更簡潔一些。

public static PageRequest of(int page, int size, Sort sort) {
returnnew   PageRequest(page, size, sort);
}

JPA 關聯查詢

在使用 Spring Boot 1.0 時,使用 JPA 關聯查詢時咱們會構建一個接口對象來接收結果集,相似以下:

publicinterfaceCollectView{
Long getId()  ;
Long getUserId()  ;
String getProfilePicture()  ;
String getTitle()  ;
}

在使用 Spring Boot 1.0 時,若是沒有查詢到對應的字段會返回空,在 Spring Boot 2.0 中會直接報空指針異常,對結果集的檢查會更加嚴格一些。

這只是目前升級過程當中發現的一些問題,不表明 Spring Boot 2.0 升級中的全部問題,在隨後的課程中會再一一介紹。

1.4.3    是否選擇升級

經過以上內容能夠看出 Spring Boot 2.0 相對於 1.0 增長了不少新特性,而且最重要的是 Spring Boot 2.0 依賴的 JDK 最低版本是 1.8,估計國內大多互聯網公司尚未這麼激進。另一個新的重大版本更新以後,不免會有一些小 Bug 什麼的,每每須要再發布幾個小版本以後,纔會慢慢穩定下來。

所以個人建議是,若是不是特別須要使用 Spring Boot 2.0 上面提到的新特性,就儘可能不要着急進行升級,等 Spring Boot 2.0 完全穩定下來後再使用。若是想要升級也請先從早期的版本升級到 Spring Boot 1.5X 系列以後,再升級到 Spring Boot 2.0 版本,Spring Boot 2.0 的不少配置內容和 Spring Boot 1.0 不一致須要注意。

Spring Boot 1.0 發佈以後給咱們帶來了全新的開發模式,Spring Boot 2.0 發佈標誌着 Spring Boot 已經走向成熟,對 Java 領域帶來的變革已經開啓!

1.4.4    總結

能夠看出 Spring Boot 2.0 是歷時 4 年開發出來的巨做,在 Spring Boot 1.0 的基礎上進行了大量的優化,淘汰了不少過時的 API,同時引入了一大批最新的技術,這些新技術在將來的一段時間內都具備引導性。在咱們學習 Spring Boot 2.0 的同時,須要同時學習 Spring Boot 2.0 引入的一些新技術,不建議你們在生產環境直接進行升級,等 Spring Boot 2.0 進一步穩

相關文章
相關標籤/搜索