Spring源碼分析(一)基本介紹


摘要:本文結合《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應用程序

Spring的聲明式事務管理功能支持web應用程序全事務化,就同你使用EJB容器管理的事務一樣。所有你的定制業務邏輯都可以由簡單的POJOs實現,並由Spring IoC容器管理。其他服務包括發送email和獨立於web層的校驗,而你可以選擇何處去執行校驗規則。Spring的ORM支持同JPA和Hibernate的整合,比如,當你使用Hibernate時,可以保持原有的映射文件及標准Hibernate SessionFactory配置。表單控制器無縫整合了web層和域模型,無需那些轉換HTTP參數到域模型的ActionForms或其他類。

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應用程序中使用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM