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-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 容器檢索對象,還支持列表的投影、選擇以及聚合等。
它們的完整依賴關係如下圖所示:
數據訪問/集成
數據訪問/集成層包括 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)聲明式事務的支持
只需要通過配置就可以完成對事務的管理,而無須手動編程。