- Spring核心技術和案例實戰
- 鄭天民
- 2579字
- 2023-06-21 18:56:29
1.3 Spring Boot與Web應用程序
前面提到Spring家族具備多款開源框架,開發人員可以基于這些開發框架實現各種Spring應用程序。在本節中,我們關注的是基于Spring Boot開發面向Web場景的服務,這也是互聯網應用程序最常見的表現形式之一。
1.3.1 剖析一個Spring Web應用程序
在介紹基于Spring Boot的開發模式之前,讓我們先將它與傳統的Spring MVC進行對比。
1.Spring MVC vs Spring Boot
在典型的Web應用程序中,前后端通常基于HTTP完成請求和響應,開發過程中需要完成HTTP請求的構建、URL地址的映射、對象的序列化和反序列化以及實現各個服務自身內部的業務邏輯,如圖1-4所示。

圖1-4 HTTP請求和響應過程
我們先來看基于Spring MVC的Web應用程序開發流程,如圖1-5所示。

圖1-5 基于Spring MVC的Web應用程序開發流程
圖1-5包括使用web.xml定義Spring的DispatcherServlet、完成啟動Spring MVC的配置文件、編寫響應HTTP請求的控制器(Controller),以及部署服務到Web服務器等流程。事實上,基于傳統的Spring MVC框架開發Web應用程序逐漸暴露出一些問題,比較典型的就是配置工作過于復雜和繁重,以及缺少必要的應用程序管理和監控機制。
如果想要優化這一套開發流程,有幾個點值得我們去挖掘,比方說減少不必要的配置工作、啟動依賴項的自動管理、簡化部署并提供應用監控等。這些優化點推動了以Spring Boot為代表的新一代開發框架的誕生。基于Spring Boot的Web應用程序開發流程如圖1-6所示。

圖1-6 基于Spring Boot的Web應用程序開發流程
從圖1-6可以看到,它與基于Spring MVC的Web應用程序開發流程在配置信息的管理、服務部署和監控等方面有明顯不同。作為Spring家族新的一員,Spring Boot提供了令人興奮的特性,這些特性的核心價值就是確保了開發過程的簡單性,具體體現在編碼、配置、部署、監控等多個方面。
● Spring Boot使編碼更簡單。
我們只需要在Maven中添加一項依賴并實現一個Controller,就可以提供微服務架構中所推崇的RESTful風格接口。
● Spring Boot使配置更簡單。
它把Spring中基于XML的功能配置方式轉換為Java Config,同時提供了.yml文件來優化原有的基于.properties和.xml文件的配置方案。.yml文件對配置信息的組織更為直觀、方便,語義也更為強大。同時,基于自動配置特性,Spring Boot對常見的各種工具和框架均提供了默認的starter組件來簡化配置。
● Spring Boot使部署更簡單。
在部署方案上,Spring Boot也創造了一鍵啟動的新模式。相較于傳統模式下的war包,Spring Boot部署包既包含業務代碼和各種第三方類庫,同時也內嵌HTTP容器。這種包結構支持java–jar命令方式的一鍵啟動,它不需要部署獨立的應用服務器,通過默認的內嵌Tomcat就可以運行整個應用程序。
● Spring Boot使監控更簡單。
相較于傳統的Spring框架,Spring Boot的一大亮點是引入了內置的監控機制,這是通過Actuator組件來實現的。基于Actuator組件,我們可以查看包含自動配置在內的應用程序的詳細信息。另一方面,也可以實時監控應用程序的運行時健康狀態。這部分信息中常見的包括內存信息、JVM信息、垃圾回收信息等。例如,可以通過“/env/{name}”端點獲取系統環境變量、通過“/mapping”端點獲取所有RESTful服務、通過“/dump”端點獲取線程工作狀態,以及通過“/metrics/{name}”端點獲取JVM性能指標等。
2.基于Spring Boot的Web應用程序開發
針對一個基于Spring Boot開發的Web應用程序,其代碼組織方式需要遵循一定的項目結構。在本書中,如果不做特殊說明,我們都將使用Maven來管理項目中的結構和包依賴。一個典型的Web應用程序的項目結構包括包依賴、啟動類、Controller類以及配置文件等4個組成部分。
● 包依賴。
Spring Boot提供了一系列starter組件來簡化各種組件之間的依賴關系。以開發Web應用程序為例,我們需要引入spring-boot-starter-web這個組件,而這個組件中并沒有具體的代碼,而只包含一些依賴,如下所示:
org.springframework.boot:spring-boot-starter
org.springframework.boot:spring-boot-starter-tomcat
org.springframework.boot:spring-boot-starter-validation
com.fasterxml.jackson.core:jackson-databind
org.springframework:spring-web
org.springframework:spring-webmvc
可以看到,這里包括傳統Spring MVC應用程序中會使用到的spring-web和spring-webmvc組件,因此Spring Boot在底層實現上還是基于這兩個組件完成對Web請求響應流程的構建的。
在應用程序中引入spring-boot-starter-web組件就像引入一個普通的Maven依賴,如下所示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
一旦spring-boot-starter-web組件引入完畢,我們就可以充分利用Spring Boot提供的自動配置機制開發Web應用程序。
● 啟動類。
使用Spring Boot的非常重要的一個步驟是創建一個Bootstrap啟動類。Bootstrap類結構簡單且比較固化,如下所示:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
可以看到,這里引入了一個全新的注解@SpringBootApplication。在Spring Boot中,添加了該注解的類就是整個應用程序的入口,一方面會啟動Spring容器,另一方面也會自動掃描代碼包結構下的@Component、@Service、@Repository、@Controller等注解,并把這些注解對應的類轉化為Bean對象,從而全部加載到Spring容器中。
● Controller類。
Bootstrap類為我們提供了Spring Boot應用程序的入口,相當于應用程序已經具備最基本的骨架。接下來我們就可以添加HTTP請求的訪問入口,表現在Spring Boot中就是一系列的Controller類。這里的Controller與Spring MVC中的Controller在概念上是一致的。一個典型的Controller類如下所示:
@RestController
@RequestMapping(value = "accounts")
public class AccountController {
@Autowired
private AccountService accountService;
@GetMapping(value = "/{accountId}")
public Account getAccountById(@PathVariable("accountId") Long accountId) {
Account account = accountService.getAccountById(accountId);
return account;
}
}
請注意,以上代碼中包含@RestController、@RequestMapping和@GetMapping這3個注解。其中,@RequestMapping用于指定請求地址的映射關系,@GetMapping的作用等同于指定了GET請求方法的@RequestMapping注解。而@RestController注解是傳統Spring MVC中所提供的@Controller注解的升級版,相當于@Controller和@ResponseEntity這兩個注解的結合體,會自動使用JSON實現序列化/反序列化操作。
● 配置文件。
注意到在src/main/resources目錄下存在一個application.yml文件,這就是Spring Boot中的默認配置文件。例如,我們可以將如下所示的端口、服務名稱以及數據庫訪問等配置信息添加到這個配置文件中:
server:
port: 8081
spring:
application:
name: orderservice
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/appointment
username: root
password: root
事實上,Spring Boot提供了強大的自動配置機制,如果沒有特殊的配置需求,開發人員完全可以基于Spring Boot內置的配置體系完成諸如數據庫訪問相關配置信息的自動集成。
1.3.2 Spring Boot中的技術組件
Spring Boot構建在Spring Framework的基礎之上,是新一代的Web應用程序開發框架。我們可以通過圖1-7來了解Spring Boot的全貌。

圖1-7 Spring Boot整體架構
通過瀏覽Spring的官方網站,我們可以看到Spring Boot已經成為Spring中最頂級的子項目之一。自2014年4月發布1.0.0版本以來,Spring Boot儼然已經發展為Java EE領域開發Web應用程序的首選框架。
通過前面的描述,可以看到Spring Boot中一個傳統Spring框架所不具備的功能特性,就是支持運行時內嵌容器,包含Tomcat、Jetty等支持Servlet規范的多款傳統Web容器可供開發人員選擇。而在最新的Spring Boot 2.x中,還提供了對Netty以及集成Servlet 3.1+的非阻塞式容器的支持。基于運行時內嵌容器機制,開發人員只需要使用一行java–jar命令就可以啟動Web服務了。
另一個通過前面的示例可以看到的功能特性就是自動配置。前面的示例并沒有像以前使用Spring MVC一樣指定一大堆關于HTTP請求和響應的XML配置。事實上,Spring Boot的運行過程同樣還是依賴于Spring MVC,但是它把原本需要開發人員指定的各種配置項設置了默認值并內置在運行時環境中,例如默認的服務器端口就是8080。如果我們對這些配置項沒有定制化需求,就可以不做任何的處理,采用既定的開發約定即可。這就是Spring Boot所倡導的約定優于配置(Convention over Configuration)的設計理念。
- Java范例大全
- Web Scraping with Python
- Apache Spark 2.x Machine Learning Cookbook
- Instant 960 Grid System
- Learn React with TypeScript 3
- Java程序設計:原理與范例
- Node Cookbook(Second Edition)
- IBM Cognos Business Intelligence 10.1 Dashboarding cookbook
- 軟件測試教程
- 人工智能算法(卷1):基礎算法
- 從程序員角度學習數據庫技術(藍橋杯軟件大賽培訓教材-Java方向)
- PHP與MySQL權威指南
- Application Development with Swift
- Python預測之美:數據分析與算法實戰(雙色)
- Python數據可視化之matplotlib實踐