初學 Spring Boot,你需要了解的 7 樣東西

zhengkenghong發表於2018-01-07

本文翻譯自 7 Things to Know Getting Started With Spring Boot by Ranga Karanam

Spring Boot 是一個比較 tricky 的框架,所以也往往不容易理解。這篇教程將講解 Spring Boot 的基本組成,包括 Starter 專案、自動配置和 Starter Parents 等,來幫助初學者能更好的理解和掌握 Spring Boot。

理解 Spring Boot 的架構

Spring Boot 包含了這些組成部分:

  1. Spring Boot Starter 專案
  2. Spring Boot Starter Parent
  3. 自動配置

首先我們會先把 Spring Boot 跟 Spring、Spring MVC 做一個比較,來幫助理解 Spring Boot 到底帶來了什麼。一旦明白了 Spring Boot 能提供什麼功能,也就能更好的使用 Spring Boot。

Spring Boot vs Spring MVC vs Spring

它們之間的關係,最重要的一點是:

Spring Boot 跟 Spring、Spring MVC 不是競爭關係,Spring Boot 是為了能更好的使用他們。

Spring 框架

Spring 框架最重要的特性就是依賴注入(Dependency Injection),而所有 Spring 模組的核心就是依賴注入和控制反轉(IOC - Inversion of Control)。

通過妥善的使用依賴注入和控制反轉,我們可以較為容易地開發出鬆散耦合的應用,並且易於測試。

Spring MVC

Spring MVC 提供了諸如 Dispatcher Servlet、ModelAndView 和 View Resolver 等,讓編寫鬆散耦合的 Web 應用變得很容易。

Spring Boot

Spring、Spring MVC 的一個弊端就是配置很複雜:

<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/views/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>
<mvc:resources mapping="/webjars/**" location="/webjars/"/>
複製程式碼

而 Spring Boot 通過自動配置Starter Project 解決了這個問題。同時它也提供了很多特性,讓構建 production-ready 的應用變得容易和迅速。

關於 Spring Boot 和 Spring、Spring MVC 更深層次的對比,請閱讀:Spring Boot vs. Spring MVC vs. Spring - How do they compare?

Spring Boot 自動配置

Spring 和 Spring MVC 有非常多的 XMl 和 Java Bean 配置。 而 Spring Boot 通過一個新思路為我們解決了這個問題:

我們能不能讓配置變得更智慧?當應用裡面增加了 Spring MVC 的 JAR 包,我們能不能自動地配置一些 Java Bean?

  • 如果 classpath 裡面有 Hibernate 的 JAR 包,Data Source 就自動配置好了,怎麼樣?
  • 如果 classpath 裡面有 Spring MAC 的 JAR 包,Dispatcher Servlet 就自動配置好了,怎麼樣?

Spring Boot 自動配置的規則:

Spring Boot 首先會檢查這兩部分:一是 classpath 裡面存在的框架;二是應用已經存在的配置。結合這兩部分,Spring Boot 就可以提供這些框架所需的基本配置,這就是 Spring Boot 的自動配置。

關於自動配置的深層講解,請閱讀:What is Spring Boot Auto Configuration?

Spring Boot Starter 專案

Spring Boot 文件裡是這樣描述 Starter 專案的:

Starter 專案是一系列方便的依賴描述,可以在我們的專案中引用。通過 starter 專案,我們能“一站式”得獲得所有所需的 Spring 以及相關技術,而不用像以前一樣去找各種事例程式碼,複製相關的依賴描述。例如:如果我們想使用 Spring 和 JPA 來連結資料庫,我們只需要把 spring-boot-starter-data-jpa 引入到我們的專案中,專案就搭建完了。

下面通過 Spring Boot Starter Web 來舉個例子:

如果我們想開發一個 Web 應用或者 RESTful 服務,我們就可以直接使用 Spring Boot Starter Web。

當把 Spring Boot Starter Web 加到我們的專案依賴中,我們就可以看到相關的很多其他依賴也被加到應用裡面了,如截圖:

初學 Spring Boot,你需要了解的 7 樣東西

這裡麵包含了很多開發一個 Web 應用所需的常用模組。通過 Spring Boot Starter Web,我們可以很容易的引入並使用它們:

  • Spring - core,beans,context,AOP
  • Web MVC - Spring MVC
  • Jackson - JSON 解析庫
  • Validation - Hibernate Validator,Validation API
  • Embedded Servlet Container - Tomcat
  • Logging - logback,slf4j

幾乎所有的 Web 應用都需要這些模組,Spring Boot Starter Web 已經打包好了這些依賴。而開發者就不需要去處理這些依賴,以及它們的版本相容問題。

Spring Boot 提供了大量這類 starter 專案。而 Spring Initializr 也全都支援,其中就包括:

  • spring-boot-starter-web-services:構建 SOAP Web 服務應用
  • spring-boot-starter-web:構建 Web 應用和 RESTful 服務
  • spring-boot-starter-test:編寫單元測試和整合測試
  • spring-boot-starter-jdbc:傳統的 JDBC 應用
  • spring-boot-starter-hateoas:給應用增加 HATEOAS 特性讓服務更 RESTful 化
  • spring-boot-starter-security:使用 Spring Security 來進行認證和授權
  • spring-boot-starter-data-jpa:Spring Data JPA 和 Hibernate
  • spring-boot-starter-cache:讓 Spring 框架支援快取
  • spring-boot-starter-data-rest:使用 Spring Data REST 來暴露一個簡單的 REST 服務

想更深入的瞭解 starter 專案,請閱讀:Initializing Projects with Spring Boot Starters - Web and JPA

Spring Boot Starter Parent

幾乎所有 Spring Boot 專案的 pom.xml 配置中,都使用了 spring-boot-starter-parent 來作為 parent 配置:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>
複製程式碼

parent POMs 讓我們更好的管理多個子專案或者模組:

  • 配置相關:Java 版本和其他屬性
  • 依賴管理:依賴的版本
  • 預設外掛的配置

想更深入的瞭解 Spring Boot Starter Parent,請閱讀:Introduction to Spring Boot Starter Parent

Spring Initializr:讓建立 Spring Boot 專案像開 F1 賽車一樣快

Spring Initializr 是一個非常好的初始化 Spring Boot 專案的工具。

它提供了一個很簡單的 UI,通過它我們可以建立各種不同型別的 Spring 專案,如:

  • Web 應用
  • RESTful 服務
  • Batch 應用

我們來體驗一下怎麼通過 Spring Initializr 來建立一個專案:

初學 Spring Boot,你需要了解的 7 樣東西

如上圖所示,只需簡單幾步:

  • 開啟 Spring Initializr (start.spring.io/)
    • Group 輸入 com.in28minutes.springboot
    • Artifact 輸入 student-services
    • dependency 選擇 Web
  • 點選頁面下方的 Generate Project 按鈕
  • 把專案匯入到 intelliJ 或者 Eclipse 即可。

想更深入的瞭解 Spring Initializr,請閱讀:Spring Initializr - Bootstrap Your Spring Boot Applications at F1 speed!

Spring Boot 和內嵌伺服器

當我們建立了一個可部署的包之後,我們可以在部署包中嵌入一個伺服器(如 Tomcat)。

例如,對於一個 Spring Boot 應用,我們可以構建一個 JAR 包,裡面包含了一個內嵌的 Tomcat 伺服器(Embedded Tomcat),然後我們就可以像執行一個普通的 Java 程式一樣啟動這個伺服器。

一個內嵌的伺服器意味著,在我們的部署包裡面包含了伺服器的二進位制檔案(如 tomcat.jar)

我們來看下 spring-boot-starter-web 的依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>2.0.0.M6</version>
    <scope>compile</scope>
</dependency>
複製程式碼

可以看到,預設情況下,Starter Web 已經包含了 Starter Tomcat 的依賴:

  • Tomcat 是 Spring Boot 的預設內嵌伺服器
  • Spring Boot 也支援 Jetty 和 Undertow

想更深入的瞭解內嵌伺服器,請閱讀:Spring Boot and Embedded Servers - Tomcat, Jetty, and Undertow

Spring Data

官方說明 projects.spring.io/spring-data…

Spring Data 提供了一個簡單、統一,且基於 Spring 程式設計模型的資料接入層,同時還能保留了底層資料儲存的一些特性。它讓我們使用資料接入技術、關係型資料庫、非關係型資料庫、map-reduce 框架以及基於雲的服務變得簡單。

簡單來說,Spring Data 提供了一個統一的抽象,我們可以不管底層多樣的資料來源,而使用一個統一的接入層。

Spring Data 包括瞭如下子模組:

  • Spring Data JPA - 關係型資料庫
  • Spring Data MongoDB
  • Spring Data REST - 封裝 Spring Data 倉庫,提供一個優秀的 REST api 服務

想更深入的瞭解 Spring Data,請閱讀:Introduction to Spring Data - Spring Data JPA, Spring Data REST, and MongoDB

其他引用

相關文章