Spring 是什麼?

概述

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)聲明式事務的支持

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

Tags: