Spring 是什麼?

劉浩(LingluSenior)發表於2021-05-29

概述

Spring 是最受歡迎的企業級 Java 應用程式開發框架,數以百萬的來自世界各地的開發人員使用 Spring 框架來建立效能好、易於測試、可重用的程式碼。

Spring 框架是一個開源的 Java 平臺,它最初是由 Rod Johnson 編寫的,並且於 2003 年 6 月首次在 Apache 2.0 許可下發布。

Spring 是輕量級的框架,其基礎版本只有 2 MB 左右的大小。

Spring 框架的核心特性是可以用於開發任何 Java 應用程式,但是在 Java EE 平臺上構建 web 應用程式是需要擴充套件的。 Spring 框架的目標是使 J2EE 開發變得更容易使用,通過啟用基於 POJO 程式設計模型來促進良好的程式設計實踐。

三層架構     

  • A 表現層   web層    MVC是表現層的一個設計模型 
  • B 業務層  service層
  • C 持久層  dao層

依賴注入(DI)

Spring 最認同的技術是控制反轉的依賴注入(DI)模式。控制反轉(IoC)是一個通用的概念,它可以用許多不同的方式去表達,依賴注入僅僅是控制反轉的一個具體的例子。

當編寫一個複雜的 Java 應用程式時,應用程式類應該儘可能的獨立於其他的 Java 類來增加這些類可重用可能性,當進行單元測試時,可以使它們獨立於其他類進行測試。依賴注入(或者有時被稱為配線)有助於將這些類粘合在一起,並且在同一時間讓它們保持獨立。

到底什麼是依賴注入?讓我們將這兩個詞分開來看一看。這裡將依賴關係部分轉化為兩個類之間的關聯。例如,類 A 依賴於類 B。現在,讓我們看一看第二部分,注入。所有這一切都意味著類 B 將通過 IoC 被注入到類 A 中。

依賴注入可以以向建構函式傳遞引數的方式發生,或者通過使用 setter 方法 post-construction。由於依賴注入是 Spring 框架的核心部分,所以我將在一個單獨的章節中利用很好的例子去解釋這一概念。

面向切面的程式設計(AOP):

Spring 框架的一個關鍵元件是面向切面的程式設計(AOP)框架。一個程式中跨越多個點的功能被稱為橫切關注點,這些橫切關注點在概念上獨立於應用程式的業務邏輯。有各種各樣常見的很好的關於方面的例子,比如日誌記錄、宣告性事務、安全性,和快取等等。

在 OOP 中模組化的關鍵單元是類,而在 AOP 中模組化的關鍵單元是方面。AOP 幫助你將橫切關注點從它們所影響的物件中分離出來,然而依賴注入幫助你將你的應用程式物件從彼此中分離出來。

Spring 框架的 AOP 模組提

供了面向方面的程式設計實現,可以定義諸如方法攔截器和切入點等,從而使實現功能的程式碼徹底的解耦出來。使用原始碼級的後設資料,可以用類似於 .Net 屬性的方式合併行為資訊到程式碼中。我將在一個獨立的章節中討論更多關於 Spring AOP 的概念。

體系結構

Spring 有可能成為所有企業應用程式的一站式服務點,然而,Spring 是模組化的,允許你挑選和選擇適用於你的模組,不必要把剩餘部分也引入。下面的部分對在 Spring 框架中所有可用的模組給出了詳細的介紹。

Spring 框架提供約 20 個模組,可以根據應用程式的要求來使用。

Spring 體系架構

核心容器

核心容器由 spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring 表示式語言,Spring Expression Language)等模組組成,它們的細節如下:

  • spring-core 模組提供了框架的基本組成部分,包括 IoC 和依賴注入功能。

  • spring-beans 模組提供 BeanFactory,工廠模式的微妙實現,它移除了編碼式單例的需要,並且可以把配置和依賴從實際編碼邏輯中解耦。

  • context 模組建立在由 core和 beans 模組的基礎上建立起來的,它以一種類似於 JNDI 註冊的方式訪問物件。Context 模組繼承自 Bean 模組,並且新增了國際化(比如,使用資源束)、事件傳播、資源載入和透明地建立上下文(比如,通過 Servelet 容器)等功能。Context 模組也支援 Java EE 的功能,比如 EJB、JMX 和遠端呼叫等。ApplicationContext 介面是 Context 模組的焦點。spring-context-support 提供了對第三方整合到 Spring 上下文的支援,比如快取(EhCache, Guava, JCache)、郵件(JavaMail)、排程(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。

  • spring-expression 模組提供了強大的表示式語言,用於在執行時查詢和操作物件圖。它是 JSP2.1 規範中定義的統一表示式語言的擴充套件,支援 set 和 get 屬性值、屬性賦值、方法呼叫、訪問陣列集合及索引的內容、邏輯算術運算、命名變數、通過名字從 Spring IoC 容器檢索物件,還支援列表的投影、選擇以及聚合等。

它們的完整依賴關係如下圖所示:

Spring JAR依賴關係

資料訪問/整合

資料訪問/整合層包括 JDBC,ORM,OXM,JMS 和事務處理模組,它們的細節如下:

(注:JDBC=Java Data Base Connectivity,ORM=Object Relational Mapping,OXM=Object XML Mapping,JMS=Java Message Service)

  • JDBC 模組提供了 JDBC 抽象層,它消除了冗長的 JDBC 編碼和對資料庫供應商特定錯誤程式碼的解析。

  • ORM 模組提供了對流行的物件關係對映 API 的整合,包括 JPA、JDO 和 Hibernate 等。通過此模組可以讓這些 ORM 框架和 spring的其它功能整合,比如前面提及的事務管理。

  • OXM 模組提供了對 OXM 實現的支援,比如 JAXB、Castor、XML Beans、JiBX、XStream 等。

  • JMS 模組包含生產(produce)和消費(consume)訊息的功能。從 Spring 4.1 開始,整合了 spring-messaging 模組。

  • 事務模組為實現特殊介面類及所有的 POJO 支援程式設計式和宣告式事務管理。(注:程式設計式事務需要自己寫 beginTransaction()、commit()、rollback() 等事務管理方法,宣告式事務是通過註解或配置由 spring 自動處理,程式設計式事務粒度更細)

Spring 框架的主要優點具體如下:

1)方便解耦,簡化開發

Spring 就是一個大工廠,可以將所有物件的建立和依賴關係的維護交給 Spring 管理。

2)方便整合各種優秀框架

Spring 不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支援。

3)降低 Java EE API 的使用難度

Spring 對 Java EE 開發中非常難用的一些 API(JDBC、JavaMail、遠端呼叫等)都提供了封裝,使這些 API 應用的難度大大降低。

4)方便程式的測試

Spring 支援 JUnit4,可以通過註解方便地測試 Spring 程式。

5)AOP 程式設計的支援

Spring 提供面向切面程式設計,可以方便地實現對程式進行許可權攔截和執行監控等功能。

6)宣告式事務的支援

只需要通過配置就可以完成對事務的管理,而無須手動程式設計。

相關文章