摘要:本文結合《Spring源碼深度解析》來分析Spring 5.0.6版本的源代碼。若有描述錯誤之處,歡迎指正。
前言
作為一名開發人員,閱讀源碼是一個很好的學習方式。本文將結合《Spring源碼深度解析》來分析Spring 5.0.6版本的源代碼,若有描述錯誤之處,歡迎指正。
Spring是2003年興起的一個輕量級Java開源框架,旨在解決企業應用開發的復雜性。Spring發展至今,衍生出非常豐富的模塊,並應用在多種場景,比如:桌面應用,Web應用等。Spring的模塊化可以允許你只使用需要的模塊,而不必全部引入。
目錄
一、整體架構
1. 核心容器
2. 數據訪問/集成
3. Web
4. AOP
5. Test
二、設計理念
三、使用場景
1. 典型的Spring web應用程序
2. Spring中間層使用第三方web框架
3. 遠程調用
4. EJBs-包裝現存POJOs
一、整體架構
Spring框架是一個分層架構,他包含一系列的功能要素,並被分為大約20個模塊,如下圖所示(很遺憾,並沒有找到Spring5的架構圖,下圖是Spring4的,但結合Spring5的源碼來看,該圖還是能夠體現Spring5的核心模塊)

這些模塊被總結為以下幾部分。
1. 核心容器
Core Container(核心容器)包含有Core、Beans、Context和Expression Language模塊。Core和Beans模塊是框架的基礎部分,提供IoC(控制反轉)和DI(依賴注入)特性。這里的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的需要,並真正地允許你從程序邏輯中分離出依賴關系和配置。
- Core模塊主要包含Spring框架基本的核心工具類,Spring的其他組件都要使用到這個包里的類,Core模塊是其他組件的基本核心。當然你也可以在自己的應用系統中使用這些工具類。
- Beans模塊是所有應用都要用到的,它包含訪問配置文件、創建和管理Bean以及進行Inversion of Control/Dependency Injection(IoC/DI)操作相關的所有類。
- Context模塊構建於Core和Beans模塊基礎之上,提供了一種類似於JNDI注冊器的框架式的對象訪問方法。Context模塊繼承了Beans的特性,為Spring核心提供了大量擴展,添加了對國際化(例如資源綁定)、事件傳播、資源加載和對Context的透明創建的支持。Context同時也支持J2EE的一些特性,例如EJB、JMX和基礎的遠程處理。ApplicationContext接口是Context模塊的關鍵。
- Expression Language 模塊提供了一個強大的表達式語言用於在運行時查詢和操縱對象。它是JSP2.1規范中定義的unifed expression language的一個擴展。該語言支持設置/獲取屬性的值,屬性的分配,方法的調用,訪問數組上下文(accession the context of arrays),容器和索引器,邏輯和算數運算符,命名變量以及從Spring的IoC容器中根據名稱檢索對象。它也支持list投影,選擇和一般的list聚合。
2. 數據訪問/集成
Data Access/Integration(數據訪問/集成)層包含有JDBC、ORM、OXM、JMS和Transaction模塊,其中:
- JDBC模塊提供了一個JDBC抽象層,它可以消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼。這個模塊包含了Spring對JDBC數據訪問進行封裝的所有類。
- ORM(Object Relational Mapping對象關系映射)模塊為流行的對象-關系映射API,如JPA、JDO、Hibernate、iBatis等,提供了一個交互層。利用ORM封裝包,可以混合使用所有Spring提供的特性進行O/R映射。如前邊提到的簡單聲明性事務管理。
Spring框架插入了若干個ORM框架,從而提供了ORM的對象關系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有這些都遵從Spring的通用事務和DAO異常層次結構。
- OXM模塊提供了一個對Object/XML映射實現的抽象層,Object/XML映射實現包括JAXB、Castor、XMLBeans、JiBX和XStream。
- JMS(Java Messaging Service)模塊主要包含了一些制造和消費消息的特性。
- Transaction模塊支持編程和聲明性的事務管理,這些事務類必須實現特定的接口,並且對所有的POJO都適用。
3. Web
Web上下文模塊建立在應用程序上下文模塊之上,為基於Web的應用程序提供了上下文。所以Spring框架支持與Jakarta Struts的集成。Web模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。Web層包含了Web、Web-Servlet、Web-Struts和Web-Porlet模塊,具體說明如下。
- Web模塊提供了基礎的面向Web的集成特性。例如,多文件上傳,使用servlet listeners初始化IoC容器以及一個面向Web的應用上下文。它還包含Spring遠程支持中Web的相關部分。
- Web-Servlet模塊(web.servlet.jar)包含Spring的model-view-controller(MVC)的實現。Spring的MVC框架使得模型范圍內的代碼和web forms之間能夠清楚地分離開來,並與Spring框架的其他特性集成在一起。
- Web-Struts模塊提供了對Struts的支持,使得類在Spring應用中能夠與一個典型的Struts Web層集成在一起,注意,該支持在Spring3.0中是deprecated的。
- Web-Porlet模塊提供了用於Portlet環境和Web-Servlet模塊的MVC的實現。
4. AOP
AOP模塊提供了一個符合AOP聯盟標准的面向切面編程的實現,它讓你可以定義例如方法攔截器和切點。從而將邏輯代碼分開,降低它們之間的耦合性。利用source-level的元數據功能,還可以將各種行為信息合並到你的代碼中,這有點像.Net技術中的attribute概念。
通過配置管理特性,SpringAOP模塊直接將面向切面的編程功能集成到了Spring框架中,所以可以很容易地使Spring框架管理的任何對象支持AOP。Spring AOP模塊為基於Spring的應用程序中的對象提供了事務管理服務。通過使用Spring AOP,不用依賴EJB組件,就可以將聲明性事務管理集成到應用程序中。
- Aspects模塊提供了對AspectJ(一個面向切面的框架,它擴展了Java語言)的集成支持。
- Instrumentation模塊提供了class instrumentation 支持和classloader實現,使得可以在特定的應用服務器上使用。
5. Test
Test模塊支持使用JUnit和TestNG對Spring組件進行測試。
二、設計理念
Spring是面向Bean的編程(BOP:Bean Oriented Programming),Bean在Spring中才是真正的主角。Bean在Spring中作用就像Object對OOP的意義一樣,沒有對象的概念就像沒有面向對象編程,Spring中沒有Bean也就沒有Spring存在的意義。Spring提供了IoC 容器通過配置文件或者注解的方式來管理對象之間的依賴關系。
控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。三、使用場景
前面描述的模塊使得Spring成為許多場景中的合理選擇,從在資源受限設備上運行的嵌入式應用程序到使用Spring事務管理功能和Web框架集成的全面的企業應用程序。
1. 典型的Spring web應用程序

2. Spring中間層使用第三方web框架

有時情況並不允許你完全切換到一個不同的框架。Spring框架不是一個要么使用全部特性要么什么都用不了的解決方案,不強制使用其中的每個功能。現存的前端如Struts,Tapestry,JSF或其他UI框架都可以同基於Spring的中間層整合在一起,從而使你能夠使用Spring事務功能。你只需要使用ApplicationContext連接你的業務邏輯以及通過WebApplicationContext整合你的web層。
3. 遠程調用

你可以使用Spring的Hessian-,Rmi-或HttpInvokerProxyFactoryBean類來通過web服務訪問現存的代碼。遠程訪問現存應用程序並不困難。
4. EJBs-包裝現存POJOs

Spring框架還為企業JavaBeans提供了一個訪問抽象層,使你能夠重用現有的POJO,並將其包裝在無狀態會話bean中,以便在可能需要聲名式安全的可擴展,故障安全的web應用程序中使用。
