當我們談論Spring的時候到底在談什麼

来源:https://www.cnblogs.com/r0ad/p/18089449
-Advertisement-
Play Games

對於程式員來說這個單詞完全擁有另外一個含義,Spring指的是一個開源項目,而這個項目非常厲害。而Spring與JSR、JarkataEE淵源頗深。 ...


你好,這裡是codetrend專欄“Spring6全攻略”。歡迎點擊關註查看往期文章。

Spring對於不做程式開發的人來說字面意思就是春天,四季的開始。

對於程式員來說這個單詞完全擁有另外一個含義,Spring指的是一個開源項目,而這個項目非常厲害。

Spring這個術語在不同的語境中有不同的含義。它可以用來指代Spring Framework項目本身。隨著時間的推移,其他Spring項目也建立在Spring Framework之上。當人們說“Spring”時,通常指的是整個項目家族。

Spring Framework被分為多個模塊。應用程式可以選擇它們需要的模塊。在核心部分是核心容器的模塊,包括配置模型和依賴註入機制。

除此之外,Spring Framework為不同的應用架構提供了基礎支持,包括消息傳遞、事務性數據和持久性,以及Web。它還包括基於Servlet的Spring MVC Web框架,同時也有Spring WebFlux響應式Web框架。

Spring的來龍去脈可以通過這個Mermaid流程圖表示。

graph LR Jakarta/Java_EE --實現--> Spring_Framework Spring項目 --使用--> Spring_Framework

Spring與企業應用開發

Java EE(Java Platform, Enterprise Edition)是一種基於Java編程語言的企業級應用程式開發平臺。它提供了一套全面的API和運行時環境,用於簡化企業級應用程式的開發和部署。Java EE包括各種技術規範和API,如Servlets、JSP、EJB、JPA、JMS等,旨在幫助開發者構建可靠、安全、可擴展的企業級應用程式。

Java EE 也是是一個不斷發展的解決方案,它設計的介面和框架以及整個解決方案在Spring框架中都有體現。也就是說Spring是Java EE的繼承者和發揚者。

Spring使得創建Java企業應用程式變得簡單。它提供了一切您在企業環境中需要的內容,支持Groovy和Kotlin作為JVM上的替代語言,並靈活地根據應用程式的需求創建多種架構。從Spring Framework 6.0開始,Spring要求使用Java 17或更高版本。

Spring支持廣泛的應用場景,而這些解決方案就是為企業開發而生。在大型企業中,應用程式通常存在很長時間,必須在開發人員無法控制的JDK和應用伺服器上運行。其他應用可能作為一個包含嵌入式伺服器的單個jar文件運行,可能在雲環境中。還有一些可能是獨立的應用程式(如batch 或者 integration workloads),不需要伺服器。

Spring是開源的。這也是Spring成功的秘訣之一。它擁有龐大而活躍的社區,基於各種真實用例提供持續反饋。Spring通過不斷迭代、不斷不斷發展變得強大。

Spring的歷史

Spring 框架誕生於 2003 年,是為了應對早期 J2EE 規範的複雜性而開發的。

儘管有人認為 Java EE 及其現代繼承者 Jakarta EE 與 Spring 處於競爭關係,但實際上它們是互補的。

Java Specification Requests (JSRs) 是 Java Community Process (JCP) 下制定的技術規範提案,它代表了一種標準化的過程。每個 JSR 都是為了定義或更新 Java 平臺的一部分,涵蓋了從核心語言、API 到企業級平臺的各種技術規格。比如 Servlet API(JSR 340)、WebSocket API(JSR 356)、JPA(JSR 338) 等都是 JSR 規範的具體實例,它們定義了 Java 開發人員應該遵循的標準介面和實現。

Spring框架實現了 JSR 規範。通過JSR規範既可以保持框架的一定相容性,又能保證框架的推廣和保持流行。但實現規範是一個選擇性的過程,Spring6框架的輕量級設計思想決定了實現規範的選擇性。

Jakarta EE(前身為 Java EE)是一個企業級 Java 平臺標準,它整合了一系列經過 JCP 認證的 JSR 規範,為開發企業級應用提供一整套解決方案,包括但不限於 web 層、業務層、持久化層和消息傳遞等方面。Spring Framework 支持並集成了許多 Jakarta EE 中的關鍵技術規範,同時又提供了自己特有的編程模型和擴展功能。

Spring 編程模型並不包含 Jakarta EE 平臺,而是從傳統 Java EE 範圍內精心選擇的個別規範集成,包括:

  • Servlet API(JSR 340)
  • WebSocket API(JSR 356)
  • 併發工具(JSR 236)
  • JSON 綁定 API(JSR 367)
  • Bean 驗證(JSR 303)
  • JPA(JSR 338)
  • JMS(JSR 914)
  • 用於事務協調的 JTA/JCA 設置

Spring 框架還支持依賴註入(JSR 330)和通用註解(JSR 250)規範,應用開發人員可以選擇使用而不是 Spring 框架提供的特定機制。這也是程式員通常提到的基於註解開發的來源。因為實現了這些統一規範,Spring的相容和功能都很強大。

最初這些JavaEE規範的實現都是放在 javax 包,也就是Spring Framework 5 以前的框架都是放在這個包路徑。比如javax.servlet.http.HttpServletRequest就是實現的這個規範Servlet API(JSR 340)的一個類。

而在Spring Framework 6中,這個類的路徑變成了Jakarta.servlet.http.HttpServletRequest。這更能說明Spring與Java EE的關係。

在現在的Springy應用中,Java/Jakarta EE 在應用程式開發中的角色已經發生了變化。在 J2EE 和 Spring 早期,應用程式被創建為部署到應用伺服器上。

現在藉助 Spring Boot,應用程式以 devops 和雲友好的方式創建,內嵌了 Servlet 容器,易於更改。

截至 Spring Framework 5,WebFlux 應用程式可以不直接使用 Servlet API,可以在不是 Servlet 容器的伺服器上運行(例如 Netty)。

Spring 是在不斷創新和發展。需要集成對應的內容,只需要引入依賴修改版本即可。

Spring與Spring生態項目有版本的限制,比如Spring5對應Springboot2,而最新的Spring6則對應最新的Spring Boot 3。

以下通過使用jarkata的實現Bean 驗證(JSR 303)這個規範的代碼例子來說明Spring Framework是如何實現Bean 驗證(JSR 303)的。

package io.yulin.learn.spring.s101;

import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.constraints.*;
import lombok.Data;

import java.util.Set;

/**
 * 演示使用jakarta ee 中的api
 * @author nine
 * @since 1.0
 */
public class JakartaEE {

    public static void main(String[] args) {
        System.out.println("hello jakarta ee");
        UserReq userReq = new UserReq();
        userReq.setName("John Doe");
        userReq.setAge(180);
//        userReq.setEmail("[email protected]");
        userReq.setSex("Male");

        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        Set<ConstraintViolation<UserReq>> violations = validator.validate(userReq);

        if (violations.isEmpty()) {
            System.out.println("UserReq is valid");
        } else {
            for (ConstraintViolation<UserReq> violation : violations) {
                System.out.println(violation.getPropertyPath() + " " + violation.getMessage());
            }
        }
    }

}

@Data
class UserReq{
    @NotBlank
    private String name;
    @Max(value = 170, message = "年齡不能大於170歲")
    @Min(value = 1,message = "年齡不能小於1歲")
    private Integer age;
    @Email(message = "請輸入郵箱格式")
    @NotEmpty
    private String email;
    @NotBlank
    private String sex;
}

通過輸出可以發現,通過簡單的註解+jarkata工具就可以驗證輸入的正確性。減少了非常多的ifelse的判斷,大大降低了代碼的複雜度。

email 不能為空
age 年齡不能大於170歲

對業務pojo的驗證介面是這樣的。實現整個驗證過程的一個實現是org.hibernate.validator.internal.engine.ValidatorImpl#validateInContext。通過反射、解析註解等過程驗證業務類。

	/**
	 * 對對象上的所有約束進行驗證。
	 */
	<T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups);

Java Specification Requests、Jakarta EE、Spring6 的關係

總的來說Spring是一個集大成者,既選擇了部分Java Specification Requests,也選擇了Jakarta EE。

  • JSRs 與 Jakarta EE 直接相關,因為 Jakarta EE 是由一系列 JSRs 組成的,它是按照 JSR 規範實現的企業級平臺標準。
  • Spring Framework 與兩者都有關聯,因為它既支持和遵守了部分 Jakarta EE 中基於 JSR 的規範,又在此基礎上發展了自己的技術和架構,提供了一套不完全依賴於 Jakarta EE 的完整應用框架。

它們三者的區別在於:

  • JSRs 是規範和標準層面的東西,它定義了技術介面和行為,而不提供具體的實現。
  • Jakarta EE 是一套遵循 JSRs 的企業級平臺實現,提供了完整的軟體棧和部署環境。
  • Spring Framework 則是一個獨立於 Jakarta EE 規範之外的應用框架,雖然相容並集成了許多 Jakarta EE 技術,但它的目標是在簡化企業級應用開發的同時,提供更多自由度和靈活性。

三者之間的關係可以mermaid流程圖表示:

flowchart LR JSR --實現--> Jakarta_EE JSR --實現--> Spring Jakarta_EE --開箱即用的--> Spring

Spring的設計原則

當學習一個框架時,重要的不僅是瞭解它能做什麼,還有它遵循的原則。

以下是Spring Framework的指導原則(來自Spring Framework 的文檔):

  • 在每個層面提供選擇。Spring允許您儘可能推遲設計決策。例如,您可以通過配置在不更改代碼的情況下切換持久性提供程式。對於許多其他基礎設施問題和與第三方API集成也是如此。
  • 容納多元化觀點。Spring支持靈活性,不對應該如何完成事務持有固定看法。它支持各種不同觀點的應用需求。
  • 保持強大的向後相容性。Spring的演進經過精心管理,版本之間幾乎沒有重大變化。Spring支持一系列精心選擇的JDK版本和第三方庫,以便維護依賴於Spring的應用程式和庫。
  • 關註API設計。Spring團隊花費大量時間和精力制定直觀且經得起時間考驗的API。
  • 設定高標準的代碼質量。Spring Framework非常重視有意義、當前且準確的javadoc。它是為數不多的幾個項目之一,可以聲稱具有清晰的代碼結構,在各個包之間沒有迴圈依賴。

其中第一條原則很顯然就是開發者常常提到的“預設大於配置”。這條原則貫穿了Spring框架的全生命周期。

通過上述原則可以看到Spring之所以如此流行和強大,並不僅僅是因為開源。還因為它優秀的設計與實現。

與程式員的業務開發流程相對比,這也是一個很好的開發流程學習模板。通過良好的設計指導更加完美的實現,通過review閉環輸出高質量的代碼。

工程化的設計在開發者的代碼和Spring6框架無處不在。通過對Spring的學習可以提升工程化開發的認知和技能。

關於作者

來自一線全棧程式員nine的八年探索與實踐,持續迭代中。歡迎關註公眾號“雨林尋北”或添加個人衛星codetrend(備註技術)。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、UDP UDP(User Datagram Protocol),用戶數據包協議,是一個簡單的面向數據報的通信協議,即對應用層交下來的報文,不合併,不拆分,只是在其上面加上首部後就交給了下麵的網路層 也就是說無論應用層交給UDP多長的報文,它統統發送,一次發送一個報文 而對接收方,接到後直接去除首 ...
  • 所有主要的瀏覽器都內置了一個XML解析器,用於訪問和操作XML XML 解析器 在訪問XML文檔之前,必須將其載入到XML DOM對象中 所有現代瀏覽器都有一個內置的XML解析器,可以將文本轉換為XML DOM對象 解析文本字元串 以下示例將一個文本字元串解析為XML DOM對象,並使用JavaSc ...
  • 概述:C++結構體的`sizeof`不總是等於每個成員的`sizeof`之和,因為對齊和填充影響了記憶體佈局。未對齊的結構體可能存在間隙,而對齊的結構體會插入填充以保持對齊。通過示例展示了結構體的記憶體對齊和填充,以及如何使用模板元編程列印結構體成員的偏移量,深入理解記憶體佈局。 在C++中,結構體的si ...
  • C++ 語法 讓我們將以下代碼分解以更好地理解它: 示例 #include <iostream> using namespace std; int main() { cout << "Hello World!"; return 0; } 示例解釋 第 1 行:#include <iostream> ...
  • https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-interview-150 對於一個可以構成“碗”的序列,最後裝滿水的話應該和最短的一邊齊平,那麼可以左右各遍歷 ...
  • 1 Spark 的 local 模式 Spark 運行模式之一,用於在本地機器上單機模擬分散式計算的環境。在 local 模式下,Spark 會使用單個 JVM 進程來模擬分散式集群行為,所有 Spark 組件(如 SparkContext、Executor 等)都運行在同一個 JVM 進程中,不涉 ...
  • 雲原生技術正重塑IT領域,本文深度剖析了其發展歷程、核心概念、生態系統及實踐案例,展望未來趨勢,揭示了這一技術如何引領企業轉型與創新。 關註【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人 ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹如何運用`QProcess`組件實現針對進程的控制管理等。當你在使用Qt進行跨平臺應用程式開發時,經常需要與外部進... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...