Spring原理揭秘(一)

什么是spring?

spring框架是一個輕量級的開源的JavaEE框架。

所謂輕量級則是:占用空間小,代碼侵入性低,代碼耦合度低,降低代碼復雜度,可以輕易適配多種框架。

隨著spring的不斷發展,它所占用的空間也不斷增大從而使得空間小的優勢逐漸降低,但是spring依然遵守著盡可能降低占用空間的方式采用了按需加載的方式來管理jar包。并且spring的輕量級真正體現在代碼的侵入性低和代碼耦合第低的特點,相比于早期的ELB框架有著明顯的優勢。

由于在spring未出現之前,大量java開發者都會使用EJB框架來進行開發,這個框架是基于JavaEE進行封裝的,對代碼的侵入性很強并且操作起來也很復雜,下面給出詳細對比。

特性EJB (傳統 EJB 2.x 為代表)Spring FrameworkSpring 的優勢/區別
編程模型侵入式、復雜非侵入式、簡單
必須實現特定接口 (SessionBean,?EntityBean,?MessageDrivenBean),業務代碼與 EJB API 緊密耦合。基于 POJO。業務類是普通 Java 類,無需實現特定框架接口或繼承基類(注解配置為主)。更簡單、更靈活、代碼更干凈、更容易理解和維護。
重量級 vs 輕量級重量級輕量級
嚴重依賴功能齊全的應用服務器?(Full J2EE App Server),啟動慢,資源消耗大。核心容器小巧高效。可以運行在?Servlet 容器 (Tomcat, Jetty)?甚至?Java SE?環境中。Spring Boot 進一步簡化了獨立部署。啟動更快、資源占用更少、部署選擇更靈活(尤其適合云和微服務)。
依賴管理復雜、容器管理靈活、依賴注入 (DI)
依賴查找 (JNDI) 或通過 EJB 容器管理的注入機制 (后來加入)。配置相對復雜。核心特性是?IoC/DI。對象依賴關系通過容器外部配置?(XML, Java Config, 注解) 注入,而非硬編碼創建。解耦更徹底、配置更清晰、測試更容易 (方便 Mock 依賴)。
服務提供方式容器提供框架集成或聲明式
事務、安全、持久化、分布式等復雜服務由 EJB 容器提供和管理。開發者通過部署描述符 (ejb-jar.xml) 或注解配置。聲明式服務:通過?AOP?和框架集成提供。
*?事務管理:?@Transactional?注解或 XML 配置。
*?安全:?Spring Security (獨立模塊)。
*?持久化:?集成 JPA/Hibernate/MyBatis 等,提供?JpaTemplate/HibernateTemplate?(簡化版) 或直接使用標準 JPA。
*?遠程調用:?支持多種方式 (RMI, Hessian, HTTP Invoker),但不強制分布式。
更靈活、更透明、非強制。可以選擇需要的服務,按需引入模塊。避免容器“黑魔法”。
測試非常困難非常容易
嚴重依賴 EJB 容器環境,需要啟動整個應用服務器或在模擬容器中進行,速度慢,復雜度高。核心是?POJO?+?DI,業務邏輯可以在容器外輕松進行單元測試。Spring 提供強大的?spring-test?模塊支持集成測試(加載部分或完整上下文)。大幅提升開發效率和代碼質量。TDD/BDD 友好。
學習曲線陡峭相對平緩
需要深入理解復雜的 EJB 規范、部署描述符、容器行為和各種服務。核心概念 (IoC, DI, AOP) 清晰,易于上手。豐富的文檔和社區支持。更容易被開發者接受和掌握。
可移植性理論高,實際受限
遵循 J2EE 標準,理論上可在不同應用服務器間移植。但實際中常遇到廠商特定行為或擴展的兼容性問題。不綁定特定容器或服務器。核心代碼是 POJO,配置是 Spring 的,可以在支持 Servlet 規范或 Java SE 的任何環境運行。真正的“一次編寫,到處運行”(在支持Java的環境)。
模塊化較弱 (早期)
EJB 規范本身是一個整體,應用服務器通常全量提供。高度模塊化設計。開發者只需引入項目實際需要的模塊 (如?spring-core,?spring-context,?spring-jdbc,?spring-webmvc)。Spring Boot 的 Starter 進一步簡化依賴管理。減少不必要的依賴和資源開銷,應用更輕量。
事務管理CMT (容器管理事務) 為主聲明式事務為主
通過容器提供聲明式事務 (@TransactionAttribute?或 XML)。功能強大,但控制相對黑盒。強大的、靈活的聲明式事務管理?(@Transactional)。也支持編程式事務。底層可適配不同事務管理器 (JDBC, JTA, Hibernate 等)。配置更直觀,行為更透明,易于理解和定制。同樣強大,且不綁定 JTA (在單數據源場景可用更輕量的資源本地事務)。
持久化Entity Beans (CMP/BMP - 復雜且低效)集成 ORM 框架
EJB 2.x Entity Beans (尤其是 CMP) 設計復雜,性能差,難以使用。EJB 3.0 引入了 JPA (借鑒了 Hibernate 等 ORM 思想)。不發明輪子,擁抱最佳實踐完美集成 JPA (Hibernate, EclipseLink 等)?和?MyBatis?等流行持久化框架。提供?JdbcTemplate?簡化 JDBC。開發者可以使用成熟、高效、社區活躍的 ORM 框架,避免了 Entity Bean 的缺陷。
分布式能力核心設計目標 (RMI-IIOP)不強制,按需選擇
天生為分布式設計 (RMI-IIOP 通信),但分布式本身帶來復雜性和性能開銷。不強制分布式。鼓勵將應用拆分為合適的粒度。需要分布式時,可選用多種技術 (Spring Cloud, REST, gRPC, 消息隊列等)。更符合“簡單設計”原則。大多數應用不需要重量級的分布式通信。微服務時代有更現代的選擇。

經過上述對比我們發現EJB就像是古代打仗時候的重騎兵一樣,相較于EJB則spring更加像是一個輕騎兵,用起來更加方便。

Spring家族:

上圖則是spring框架的總體功能,可以看到spring的核心是在Core當中,也就是樹的根。這個Core種含有IOC容器和一些Framework工具類。因此我們可以看出整個spring架構種的核心其實就是IOC容器,如果沒有IOC容器的支持整個spring的其他功能都無法正常運行。

spring家族目前有以下幾大類

  • Spring Framework?是地基。

  • Spring Boot?是快速構建獨立應用的加速器。

  • Spring Data?統一數據訪問。

  • Spring Security?保障安全。

  • Spring Cloud?構建和管理分布式微服務系統。

  • 其他組件 (Integration, Batch, Session, GraphQL, HATEOAS, Shell, Kafka/AMQP, Vault, Statemachine) 解決特定領域的復雜問題。

spring的特點:

方便解耦,簡化開發

AOP編程支持

方便程序測試

方便和其他框架整合

方便進行事務操作

降低API開發的難度

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89329.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Visual Studio Code自用搜索技巧整理

多文件跨行搜索 用途 在多個日志文件中搜索跨行日志 方法 1.用VS Code打開待搜索文件所在的目錄; 2.按快捷鍵(CtrlShiftF)打開全局搜索; 3.點擊搜索框右側的開啟正則表達式; 4.輸入正則表達式,例如&…

Axure PR 9 驗證碼登錄 案例

大家好,我是大明同學。 這期內容,我們來用Axure來制作一個短信驗證登錄頁面的小案例。 驗證碼登錄小案例 創建手機號輸入框所需的元件 1.打開一個新的 RP 文件并在畫布上打開 Page 1。 2.在元件庫中拖出一個矩形元件,選中矩形元件&#xf…

監聽器模式

1. 問題背景 假設我們有一個 銀行賬戶管理系統,該系統需要監控用戶賬戶余額的變動,并在發生變動時,自動執行一些相關的操作,比如發送 余額變動通知(如短信、郵件等)。為了實現這一功能,我們希望…

帕魯杯應急響應賽題:知攻善防實驗室

一、背景信息 在這個跳躍的數字舞臺上,數據安全成了政企單位穩航的重要壓艙石。某政企單位,作為一艘駛向未來 的巨輪,對數據的把控絲毫不敢松懈。眼下,我們即將啟航一場無與倫比的探險——“信息安全探索之 旅”。 這趟旅程的目的…

【硬核數學】2.2 深度學習的“微積分引擎”:自動微分與反向傳播《從零構建機器學習、深度學習到LLM的數學認知》

歡迎來到本系列的第七篇文章。在上一章,我們用張量武裝了我們的線性代數知識,學會了如何描述和操作神經網絡中的高維數據流。我們知道,一個神經網絡的“前向傳播”過程,就是輸入張量經過一系列復雜的張量運算(矩陣乘法…

DAY 45 Tensorboard使用介紹

浙大疏錦行https://blog.csdn.net/weixin_45655710知識點回顧: tensorboard的發展歷史和原理tensorboard的常見操作tensorboard在cifar上的實戰:MLP和CNN模型 作業:對resnet18在cifar10上采用微調策略下,用tensorboard監控訓練過程…

2023年全國碩士研究生招生考試英語(一)試題總結

文章目錄 題型與分值分布完形填空錯誤 1:考察連詞 or 前后內容之間的邏輯關系錯誤2:錯誤3:錯誤4:這個錯得最有價值,因為壓根沒讀懂錯誤5:學到的短語: 仔細閱讀排序/新題型翻譯小作文大作文 題型…

react-數據Mock實現——json-server

什么是mock? 在前后端分離的開發模式下,前端可以在沒有實際后端接口的支持下先進行接口數據的模擬,進行正常的業務功能開發 json-server實現數據Mock json-server是一個node的包,可以在不到30秒內獲得零編碼的完整Mock服務 實現…

使用POI導入解析excel文件

首先校驗 /*** 校驗導入文件* param file 上傳的文件* return 校驗結果,成功返回包含成功狀態的AjaxResult,失敗返回包含錯誤信息的AjaxResult*/private AjaxResult validateImportFile(MultipartFile file) {if (file.isEmpty()) {return AjaxResult.er…

從0開始學習計算機視覺--Day06--反向傳播算法

盡管解析梯度可以讓我們省去巨大的計算量,但如果函數比較復雜,對這個損失函數進行微分計算會變得很困難。我們通常會用反向傳播技術來遞歸地調用鏈式法則來計算向量每一個方向上的梯度。具體來說,我們將整個計算過程的輸入與輸入具體化&#…

企業流程知識:《學習觀察:通過價值流圖創造價值、消除浪費》讀書筆記

《學習觀察:通過價值流圖創造價值、消除浪費》讀書筆記 作者:邁克魯斯(Mike Rother),約翰舒克(John Shook) 出版時間:1999年 歷史地位:精益生產可視化工具的黃金標準&am…

Day02_C語言IO進程線程

01.思維導圖 02.將當前的時間寫入到time. txt的文件中,如果ctrlc退出之后,在再次執行支持斷點續寫 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止,再次執行程序 4.2022-04-26 20:00:00 5.2022-04-26 2…

FFmpeg中TS與MP4格式的extradata差異詳解

在視頻處理中,extradata是存儲解碼器初始化參數的核心元數據,直接影響視頻能否正確解碼。本文深入解析TS和MP4格式中extradata的結構差異、存儲邏輯及FFmpeg處理方案。 📌 一、extradata的核心作用 extradata是解碼必需的參數集合&#xff0…

【CV數據集介紹-40】Cityscapes 數據集:助力自動駕駛的語義分割神器

🧑 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

SAP月結問題9-FAGLL03H與損益表中研發費用金額不一致(FAGLL03H Bug)

SAP月結問題9-FAGLL03H與損益表中研發費用金額不一致(S4 1709) 財務反饋,月結后核對數據時發現FAGLL03H導出的研發費用與損益表中的研發費用不一致,如下圖所示: 對比FAGLL03H與損益表對應的明細,發現FAGLL03H與損益表數據存在倍數…

HTML inputmode 屬性詳解

inputmode 是一個 HTML 屬性&#xff0c;用于指定用戶在編輯元素或其內容時應使用的虛擬鍵盤布局類型。它主要影響移動設備和平板電腦的輸入體驗。 語法 <input inputmode"value"> <!-- 或 --> <textarea inputmode"value"></texta…

軟考中級【網絡工程師】第6版教材 第1章 計算機網絡概述

考點分析&#xff1a; 本章重要程度&#xff1a;一般&#xff0c;為后續章節做鋪墊&#xff0c;有總體認識即可&#xff0c;選擇題1-2分高頻考點&#xff1a;OSI模型、TCP/IP模型、每個層次的功能、協議層次新教材變化&#xff1a;刪除網絡結構、刪除X.25、更新互聯網發展【基本…

Mysql事務與鎖

數據庫并發事務 數據庫一般都會并發執行多個事務&#xff0c;多個事務可能會并發的對相同的一批數據進行增刪改查操作&#xff0c;可能就會導致我們說的臟寫、臟讀、不可重復讀、幻讀這些問題。為了解決這些并發事務的問題&#xff0c;數據庫設計了事務隔離機制、鎖機制、MVCC多…

Bilibili多語言字幕翻譯擴展:基于上下文的實時翻譯方案設計

Bilibili多語言字幕翻譯擴展&#xff1a;基于上下文的實時翻譯方案設計 本文介紹了一個Chrome擴展的設計與實現&#xff0c;該擴展可以為Bilibili視頻提供實時多語言字幕翻譯功能。重點討論了字幕翻譯中的上下文問題及其解決方案。 該項目已經登陸Chrome Extension Store: http…

熱血三國野地名將列表

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>野地名將信息表</title><style>tabl…