1. 程式人生 > >告訴你,Spring Boot 真是個牛逼貨!

告訴你,Spring Boot 真是個牛逼貨!

現在 Spring Boot 非常火,各種技術文章,各種付費教程,多如牛毛,可能還有些不知道 Spring Boot 的,那它到底是什麼呢?有什麼用?今天給大家詳細介紹一下。

Spring Boot 的背景

瞭解 Spring Boot 必須先說說 Spring 框架!

在 Java 後端框架繁榮的今天,Spring 框架無疑是最最火熱,也是必不可少的開源框架,更是穩坐 Java 後端框架的龍頭老大。

用過 Spring 框架的都知道 Spring 能流行是因為它的兩把利器:IOC 和 AOP,IOC 可以幫助我們管理物件的依賴關係,極大減少物件的耦合性,而 AOP 的切面程式設計功能可以更方面的使用動態代理來實現各種動態方法功能(如事務、快取、日誌等)。

而要整合 Spring 框架,必須要用到 XML 配置檔案,或者註解式的 Java 程式碼配置。無論是使用 XML 或者程式碼配置方式,都需要對相關元件的配置有足夠的瞭解,然後再編寫大量冗長的配置程式碼。

然後又有多少開發人員能精通這些配置呢?如果我們只提供一些配置引數讓框架能自動配置這些元件,那是不是 so easy?

基於簡化 Spring 快速上手為目的,Spring Boot 框架誕生了!

什麼是 Spring Boot?

Spring Boot是 Spring 開源組織下的一個子專案,也是 Spring 元件一站式解決方案,主要是為了簡化使用 Spring 框架的難度,簡省繁重的配置。

Spring Boot提供了各種元件的啟動器(starters),開發者只要能配置好對應元件引數,Spring Boot 就會自動配置,讓開發者能快速搭建依賴於 Spring 元件的 Java 專案。

Spring Boot不但能建立傳統的 war 包應用,還能建立獨立的不依賴於任何外部容器(如:tomcat)的獨立應用,使用 java -jar 命令就能啟動。同時,Spring Boot也提供了一個命令列工具來執行 Spring 的指令碼。

Spring Boot 的官方網站:

Spring Boot 的原始碼:

Spring Boot 的設計目標

如果你不清楚 Spring 是幹嘛用的,那再來看看設計它的目標和初衷是什麼!

  • 為 Spring 應用開發提供一個更快、更容易上手的入門體驗;

  • 提供一系列在大型專案中經常用到的公共的非功能性特性,如:內嵌入伺服器、安全、度量指標、健康檢測、外部化配置;

  • 零程式碼配置生成及零 XML 配置;

Spring Boot 為什麼能這麼火?

Spring Boot 為什麼能這麼火?是因為它有以下幾個特色。

1、獨立執行

Spring Boot內嵌了各種 Servlet 容器,Tomcat、Jetty等,現在不再需要打成 war 包部署到容器中,Spring Boot 只要打成一個可執行的jar包就能獨立執行,所有的依賴包都在一個 jar 包內。

2、簡化 Maven 配置

如上圖所示,現在只要依賴 spring-boot-starter-web 啟動器包,它包含所有 web 開發所有的依賴,就能擁有 Spring Web 的能力,極大簡少了 maven 對依賴的配置。

使用 Maven 命令:mvn dependency:tree 也可以看到完整的依賴樹:


[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.0.1.RELEASE:compile

[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:2.0.1.RELEASE:compile

[INFO] |  |  +- org.springframework.boot:spring-boot:jar:2.0.1.RELEASE:compile

[INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:2.0.1.RELEASE:compile

[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.0.1.RELEASE:compile

[INFO] |  |  |  +- ch.qos.logback:logback-classic:jar:1.2.3:compile

[INFO] |  |  |  |  \- ch.qos.logback:logback-core:jar:1.2.3:compile

[INFO] |  |  |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.10.0:compile

[INFO] |  |  |  |  \- org.apache.logging.log4j:log4j-api:jar:2.10.0:compile

[INFO] |  |  |  \- org.slf4j:jul-to-slf4j:jar:1.7.25:compile

[INFO] |  |  +- javax.annotation:javax.annotation-api:jar:1.3.2:compile

[INFO] |  |  \- org.yaml:snakeyaml:jar:1.19:runtime

[INFO] |  +- org.springframework.boot:spring-boot-starter-json:jar:2.0.1.RELEASE:compile

[INFO] |  |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.5:compile

[INFO] |  |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile

[INFO] |  |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.9.5:compile

[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.9.5:compile

[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.9.5:compile

[INFO] |  |  \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.9.5:compile

[INFO] |  +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.0.1.RELEASE:compile

[INFO] |  |  +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.29:compile

[INFO] |  |  +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.29:compile

[INFO] |  |  \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.29:compile

[INFO] |  +- org.hibernate.validator:hibernate-validator:jar:6.0.9.Final:compile

[INFO] |  |  +- javax.validation:validation-api:jar:2.0.1.Final:compile

[INFO] |  |  +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:compile

[INFO] |  |  \- com.fasterxml:classmate:jar:1.3.4:compile

[INFO] |  +- org.springframework:spring-web:jar:5.0.5.RELEASE:compile

[INFO] |  |  \- org.springframework:spring-beans:jar:5.0.5.RELEASE:compile

[INFO] |  \- org.springframework:spring-webmvc:jar:5.0.5.RELEASE:compile

[INFO] |    +- org.springframework:spring-aop:jar:5.0.5.RELEASE:compile

[INFO] |    +- org.springframework:spring-context:jar:5.0.5.RELEASE:compile

[INFO] |    \- org.springframework:spring-expression:jar:5.0.5.RELEASE:compile

3、自動配置

Spring Boot能根據當前類路徑下的類或者 jar 包裡面來的類來自動配置 Spring Bean,如新增一個 spring-boot-starter-web 啟動器就能擁有 web 的功能,無需其他配置。也可以在配置檔案中新增相關配置來自定義裝配,這個後面的課程會講到,請關注後續內容。

4、無程式碼生成和XML配置

Spring Boot配置過程中無程式碼生成,也無需XML配置檔案就能完成所有配置工作,這一切都是藉助於條件註解完成的,這也是 Spring 4+ 的核心功能之一。

5、應用監控

Spring Boot提供一系列端點可以監控服務及應用,能對Spring 應用做健康檢測。

Spring Boot 的缺點

說了這麼多 Spring Boot 的優點和特色,雖然上手很容易,但也不是沒有缺點。任何框架都有其優缺點,Spring Boot 也不例外,我大概可以總結有以下幾個缺點。

1、需要非常瞭解 Spring Boot 的核心技術原理,不然一旦遇到問題就很棘手。因為什麼東西都集成了,自動配置化。這樣,需要對配置資訊非常熟悉,要找起問題來不是很容易。

2、從原始 Spring 專案很難平滑遷移至 Spring Boot 框架上來,因為有些歷史老舊的 XML 配置無法通過 Java 來配置,還需要額外的 XML 檔案就不是很完美。再比如,之前是獨立的 Tomcat,什麼引數都在線上配置好了,你改為內建的 Tomcat 就會遇到很多問題。

相對於優點來說,這些缺點也都不算什麼。總之,Spring Boot 是值得我們任何一個 Java 開發者嘗試摸索的。

更多幹貨推薦

更多請掃描下方的二維碼關注我們的微信公眾號Java技術棧(id: javastack),Java乾貨每日推送!

Java技術棧