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

摘要:本文結合《Spring源碼深度解析》來分析Spring 5.0.6版本的源代碼。如有描述錯誤之處,歡迎指正。前端

 

前言

做爲一名開發人員,閱讀源碼是一個很好的學習方式。本文將結合《Spring源碼深度解析》來分析Spring 5.0.6版本的源代碼,如有描述錯誤之處,歡迎指正。web

Spring是2003年興起的一個輕量級Java開源框架,旨在解決企業應用開發的複雜性。Spring發展至今,衍生出很是豐富的模塊,並應用在多種場景,好比:桌面應用,Web應用等。Spring的模塊化能夠容許你只使用須要的模塊,而沒必要所有引入。數據庫

目錄

1、總體架構express

1. 核心容器編程

2. 數據訪問/集成數組

3. Web安全

4. AOP服務器

5. Test架構

2、設計理念app

3、使用場景

1. 典型的Spring web應用程序

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

3. 遠程調用

4. EJBs-包裝現存POJOs

1、總體架構

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組件進行測試。

2、設計理念

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)。經過控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體,將其所依賴的對象的引用傳遞給它。也能夠說,依賴被注入到對象中。

3、使用場景

前面描述的模塊使得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應用程序中使用。

相關文章
相關標籤/搜索