什么是spring?
spring框架是一個輕量級的開源的JavaEE框架。
所謂輕量級則是:占用空間小,代碼侵入性低,代碼耦合度低,降低代碼復雜度,可以輕易適配多種框架。
隨著spring的不斷發展,它所占用的空間也不斷增大從而使得空間小的優勢逐漸降低,但是spring依然遵守著盡可能降低占用空間的方式采用了按需加載的方式來管理jar包。并且spring的輕量級真正體現在代碼的侵入性低和代碼耦合第低的特點,相比于早期的ELB框架有著明顯的優勢。
由于在spring未出現之前,大量java開發者都會使用EJB框架來進行開發,這個框架是基于JavaEE進行封裝的,對代碼的侵入性很強并且操作起來也很復雜,下面給出詳細對比。
特性 | EJB (傳統 EJB 2.x 為代表) | Spring Framework | Spring 的優勢/區別 |
---|---|---|---|
編程模型 | 侵入式、復雜 | 非侵入式、簡單 | |
必須實現特定接口 (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開發的難度