一次搞清Spring 、Spring Boot、Spring Web MVC、Spring WebFlux
在軟件開發(fā)中,應用框架為代碼庫提供基礎設施支持,使編程更容易。Spring是Java領域最受歡迎的開源應用框架。Spring由多個模塊和附加組件組成,術語“Spring”通常用來指代整個Spring項目族。
對于剛接觸Spring生態(tài)系統(tǒng)的人來說,很容易混淆Spring、Spring Boot、Spring Web MVC和Spring WebFlux之間的區(qū)別。在本文為讀者介紹這些概念和區(qū)別。
1 Spring
Spring Framework是其他所有Spring項目的基礎,例如Spring Web MVC框架、Spring WebFlux響應式Web框架、用于自動配置和創(chuàng)建微服務的Spring Boot擴展。
下圖顯示了Spring生態(tài)系統(tǒng)元素之間的關系:
圖片
Spring始于2003年,是一個輕量級的Java開發(fā)框架,用于幫助企業(yè)環(huán)境中采用和應用Java。Spring提供了對不同應用架構的基本支持。該框架涵蓋了消息傳遞、事務數(shù)據(jù)和持久化以及Web。Spring還包括兩個Web框架:Spring MVC和Spring WebFlux。
該框架“為現(xiàn)代基于Java的企業(yè)應用程序提供了全面的編程和配置模型”,無論最終部署環(huán)境如何。Spring的一個關鍵要素是基礎設施支持。將其視為企業(yè)應用程序的“管道提供者”,使開發(fā)人員可以專注于更有價值的工作,確定業(yè)務邏輯。
1.1 Spring的主要特性
Spring的核心特性之一是依賴注入(一種應用反轉原則的實現(xiàn)方式)。
控制反轉(IoC)是一種軟件設計模式,使應用程序的定制部分可以從通用框架中獲取控制流。通過IoC,開發(fā)人員可以將通用任務委托給可重用的庫,而不是自己編寫定制代碼來調用。依賴注入是IoC的一種實現(xiàn)方式,允許開發(fā)人員為對象提供其所依賴的其他對象,從而實現(xiàn)對象之間的解耦。這使得在單元測試中使用存根和模擬變得更加容易,從而方便對這些類進行測試。
與Spring相關的一個關鍵術語是“bean”的概念。Bean是應用程序中由Spring的IoC容器實例化、組裝和管理的對象。通過依賴注入,Spring的容器將負責在創(chuàng)建bean時注入所有所需的依賴關系。在配置和規(guī)范應用程序邏輯時,Spring的一個獨特特性是將依賴關系配置和規(guī)范與應用程序的邏輯解耦。
Spring非常適用于構建無服務器應用程序、異步應用程序和可擴展的微服務,安全性是其中的一個重點。該框架包含了促進應用程序開發(fā)的模塊和功能?;旧希琒pring包含了現(xiàn)代Web應用程序所需的所有構建模塊,包括:
- 管理身份驗證和授權
- 提供面向方面的編程框架
- 遵循MVC原則
- 管理事務
- 管理對關系數(shù)據(jù)庫和映射器的數(shù)據(jù)訪問(Spring還支持NoSQL數(shù)據(jù)庫)
- 提供單元測試和集成測試支持
Spring還包括兩種類型的Web框架:基于Servlet的Spring Web MVC框架和Spring WebFlux響應式Web框架。在下文中,了解更多關于Web框架的內容。
1.2 使用Spring的優(yōu)勢
那么為什么Spring如此受歡迎?答案可以從Spring設計的原則中找到:它既輕量級又非常靈活,提供直觀的API,并提供向后兼容性,以便更容易進行維護。該框架支持應用程序開發(fā)的所有層次,通過依賴注入實現(xiàn)松耦合,并支持輕松進行測試。
Spring的其他好處包括:
- 支持聲明式編程,例如在不描述控制流的情況下表達計算邏輯。
- 通過XML和注釋配置提供配置Spring的靈活性,具體取決于您的選擇。
- 通過Spring IoC或面向方面的編程(AOP)提供中間件服務,例如在開發(fā)分布式應用程序時。
2 Spring Web框架
如前所述,Spring提供了兩個Web框架:Spring Web MVC和Spring WebFlux。
Spring Web MVC是最初包含在Spring框架中的Web框架,專為Servlet API和Servlet容器設計。
后來添加的Spring WebFlux是一個響應式堆棧的Web框架。
Web MVC和WebFlux可以共存,并作為可選模塊工作,因此可以根據(jù)應用程序的要求使用其中一個或兩個都不使用。
2.1 Spring Web MVC
Spring Web MVC是Spring框架內經常使用的Web框架。MVC是Model-View-Controller的縮寫,用于設計Web應用程序的三個關鍵組件:
- Model:設置規(guī)則和邏輯,并包含應用程序的數(shù)據(jù)結構。
- View:定義UI邏輯,并生成用戶在Web瀏覽器中看到的HTML輸出。
- Controller:該組件提供訪問應用程序行為的方式,通常通過服務接口來定義。它解釋用戶輸入,驗證它,并將其轉換為將由View組件呈現(xiàn)給用戶的模型。
Spring Web MVC的請求處理工作流程
通過這些核心組件,Spring Web MVC可以高效地將業(yè)務邏輯、展示邏輯和導航邏輯分離,這在構建模塊化的Web應用程序時非常有用。
Spring Web MVC可以單獨使用,作為構建Java應用程序的Spring框架的一部分。然而,使用Spring Boot,這個過程將需要更少的手動配置,使其更快、更容易。
2.2 Spring WebFlux
Spring WebFlux是一個反應式且完全非阻塞的框架,能夠處理并發(fā)并實現(xiàn)高效擴展。在更復雜的應用程序中,反應性對于互操作性至關重要,這些應用程序需要高級別和功能豐富的API來組合異步邏輯。
WebFlux使用Reactor庫,該庫專注于服務器端Java,因此Reactor是一個核心依賴項。但是WebFlux實際上也可以通過Reactive Streams與其他反應式庫一起使用。
使用WebFlux的好處在于:
- 支持多種服務器(包括Netty、Tomcat、Jetty、Undertow和Servlet容器)
- 提供兩種編程模型的選擇(注解控制器和功能性Web端點)
- 并允許選擇要使用的反應式庫(Reactor、RxJava或其他庫)。
3 Spring Boot
Spring Boot是Spring框架的擴展,自動配置了一系列所需元素。將Spring Boot視為傳統(tǒng)Spring的自動化版本。
使用Spring Boot可以輕松創(chuàng)建使用Spring框架的獨立的生產級應用程序。使用Spring Boot,無需擔心編寫設置應用程序的樣板配置,所有這些都會自動處理。
3.1 Spring Boot主要功能:
Spring Boot對Spring提供了一種見解,提供了“starter”依賴項和對Spring和第三方庫的自動配置,以便快速啟動。這使得Spring Boot成為從零開始引導Spring應用程序的強大工具。
Spring Boot基本上是Spring應用程序的項目初始化器,可以幫助開發(fā)人員開發(fā)用于網站和整個基于移動設備的應用程序的微服務。在檢查類路徑和配置的Bean后,Spring Boot會嘗試自動確定和添加丟失的元素。Spring Boot自動提供默認代碼和基于注解的配置,加速應用程序的開發(fā)。Spring Boot還提供了一系列可用于生產的功能,包括各種指標、健康檢查和外部化配置。
Spring Boot可以與流行的內嵌式Servlet容器(包括Tomcat、Jetty和Undertow)一起使用,但Spring Boot應用程序也可以部署到與Servlet 5.0+兼容的任何容器中。
3.2 使用Spring Boot的優(yōu)勢
Spring Boot的主要優(yōu)勢在于它提供了一種簡單而非??焖俚臉嫿ê筒渴饝贸绦虻姆绞健J褂盟兄跍p少代碼長度,并輕松獲得Spring框架的優(yōu)勢。
Spring Boot提供的自動配置節(jié)省了編寫代碼的時間和精力成本,減少了開發(fā)時間并簡化了配置。Spring Boot使你能夠以符合DevOps和云友好的方式構建應用程序。它易于啟動、管理和定制,并且不需要XML配置。
3.3 Spring Boot的缺點:
由于Spring Boot創(chuàng)建了許多未使用的依賴項,通常不適用于復雜的大型企業(yè)應用程序。這可能會導致部署文件變得很大,造成不必要的混亂。
將遺留系統(tǒng)替換為Spring Boot應用程序可能需要相當長的時間,并且成本可能超過收益。
3.4 Spring vs Spring Boot
應該使用純Spring還是Spring Boot?這取決于您的需求。
Spring Boot提供了自動配置和“合理的”默認設置,用于各種Spring組件,重點是構建REST API。Spring Boot的另一個優(yōu)點是,您不需要深入了解Spring就可以開始編寫簡單的應用程序(畢竟,大多數(shù)配置都是開箱即用的)。
對于大多數(shù)新項目,使用Spring Boot并在必要時手動調整自動配置是有意義的。這尤其適用于部署在云端或基于容器的架構上的應用程序。對于構建大型的企業(yè)級Java應用程序,Spring可能是一個更好的選擇。