《Spring源碼深度解析》學習筆記

《Spring源碼深度解析》學習筆記——Spring的整體架構與容器的基本實現

spring框架是一個分層架構,它包含一系列的功能要素,並被分爲大約20個模塊,如下圖所示

這些模塊被總結爲以下幾個部分:

  • Core Container

    Core Container(核心容器)包含有Core、Beans、Context和Expression Language模塊 
    Core和Beans模塊是框架的基礎部分,提供IoC(轉控制)和依賴注入特性。這裏的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的需要,並真正地允許你從程序邏輯中分離出依賴關係和配置

    • Core模塊主要包含Spring框架基本的核心工具類
    • Beans模塊是所有應用都要用到的,它包含訪問配置文件、創建和管理bean以及進行Inversion of Control/Dependency Injection(Ioc/DI)操作相關的所有類
    • Context模塊構建於Core和Beans模塊基礎之上,提供了一種類似於JNDI註冊器的框架式的對象訪問方法。Context模塊繼承了Beans的特性,爲Spring核心提供了大量擴展,添加了對國際化(如資源綁定)、事件傳播、資源加載和對Context的透明創建的支持。ApplicationContext接口是Context模塊的關鍵
    • Expression Language模塊提供了一個強大的表達式語言用於在運行時查詢和操縱對象,該語言支持設置/獲取屬性的值,屬性的分配,方法的調用,訪問數組上下文、容器和索引器、邏輯和算術運算符、命名變量以及從Spring的IoC容器中根據名稱檢索對象
  • Data Access/Integration

    • JDBC模塊提供了一個JDBC抽象層,它可以消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼,這個模塊包含了Spring對JDBC數據訪問進行封裝的所有類
    • ORM模塊爲流行的對象-關係映射API,如JPA、JDO、Hibernate、iBatis等,提供了一個交互層,利用ORM封裝包,可以混合使用所有Spring提供的特性進行O/R映射,如前邊提到的簡單聲明性事務管理
  • 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層集成在一起
    • Web-Porlet模塊:提供了用於Portlet環境和Web-Servlet模塊的MVC的實現
  • AOP

    AOP模塊提供了一個符合AOP聯盟標準的面向切面編程的實現,它讓你可以定義例如方法攔截器和切點,從而將邏輯代碼分開,降低它們之間的耦合性,利用source-level的元數據功能,還可以將各種行爲信息合併到你的代碼中

    Spring AOP模塊爲基於Spring的應用程序中的對象提供了事務管理服務,通過使用Spring AOP,不用依賴EJB組件,就可以將聲明性事務管理集成到應用程序中

  • Test

    Test模塊支持使用Junit和TestNG對Spring組件進行測試

容器的基本實現

Spring的結構組成

beans包的層級結構

beans包中的各個源碼包的功能如下

  • src/main/java 用於展現Spring的主要邏輯
  • src/main/resources 用於存放系統的配置文件
  • src/test/java 用於對主要邏輯進行單元測試
  • src/test/resources 用於存放測試用的配置文件

核心類介紹

1.DefaultListableBeanFactory

XmlBeanFactory繼承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整個bean加載的核心部分,是Spring註冊及加載bean的默認實現,而對於XmlBeanFactory與DefaultListableBeanFactory不同的地方其實是在XmlBeanFactory中使用了自定義的XML讀取器XmlBeanDefinitionReader,實現了個性化的BeanDefinitionReader讀取,DefaultListableBeanFactory繼承了AbstractAutowireCapableBeanFactory並實現了ConfigURableListableBeanFactory以及BeanDefinitionRegistry接口。以下是ConfigURationListableBeanFactory的層次結構圖以下相關類圖

容器加載相關類圖

類圖中各個類的作用:

  • AliasRegistry:定義對alias的簡單增刪改等操作
  • SimpleAliasRegistry:主要使用map作爲alias的緩存,並對接口AliasRegistry進行實現
  • SingletonBeanRegistry:定義對單例的註冊及獲取
  • BeanFactory:定義獲取bean及bean的各種屬性
  • DefaultSingletonBeanRegistry:對接口SingletonBeanRegistry各函數的實現
  • HierarchicalBeanFactory:繼承BeanFactory,也就是在BeanFactory定義的功能的基礎上增加了對parentFactory的支持
  • BeanDefinitionRegistry:定義對BeanDefinition的各種增刪改操作
  • FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基礎上增加了對FactoryBean的特殊處理功能
  • ConfigurableBeanFactory:提供配置Factory的各種方法
  • ListableBeanFactory:根據各種條件獲取bean的配置清單
  • AbstractBeanFactory:綜合FactoryBeanRegistrySupport和ConfigurationBeanFactory的功能
  • AutowireCapableBeanFactory:提供創建bean、自動注入、初始化以及應用bean的後處理器
  • AbstractAutowireCapableBeanFactory:綜合AbstractBeanFactory並對接口AutowireCapableBeanFactory進行實現
  • ConfigurableListableBeanFactory:BeanFactory配置清單,指定忽略類型及接口等
  • DefaultListableBeanFactory:綜合上面所有功能,主要是對Bean註冊後的處理

 

2.XmlBeanDefinitionReader

XML配置文件的讀取是Spring中重要的功能,因爲Spring的大部分功能都是以配置作爲切入點的,可以從XmlBeanDefinitionReader中梳理一下資源文件讀取、解析及註冊的大致脈絡,首先看看各個類的功能

  • ResourceLoader:定義資源加載器,主要應用於根據給定的資源文件地址返回對應的Resource
  • BeanDefinitionReader:主要定義資源文件讀取並轉換爲BeanDefinition的各個功能
  • EnvironmentCapable:定義獲取Environment方法
  • DocumentLoader:定義從資源文件加載到轉換爲Document的功能
  • AbstractBeanDefinitionReader:對EnvironmentCapable、BeanDefinitionReader類定義的功能進行實現
  • BeanDefinitionDocumentReader:定義讀取Document並註冊BeanDefinition功能
  • BeanDefinitionParserDelegate:定義解析Element的各種方法

整個XML配置文件讀取的大致流程,在XmlBeanDefinitionReader中主要包含以下幾步處理

 

(1)通過繼承自AbstractBeanDefinitionReader中的方法,來使用ResourceLoader將資源文件路徑轉換爲對應的Resource文件

(2)通過DocumentLoader對Resource文件進行轉換,將Resource文件轉換爲Document文件

(3)通過實現接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader類對Document進行解析,並使用BeanDefinitionParserDelegate對Element進行解析

 

容器的基礎XmlBeanFactory

BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));

通過XmlBeanFactory初始化時序圖看一看上面代碼的執行邏輯

時序圖從BeanFactoryTest測試類開始,首先調用ClassPathResource的構造函數來構造Resource資源文件的實例對象,這樣後續的資源處理就可以用Resource提供的各種服務來操作了

 

配置文件封裝

Spring的配置文件讀取是通過ClassPathResource進行封裝的,Spring對其內部使用到的資源實現了自己的抽象結構:Resource接口來封裝底層資源

public interface InputStreamSource {
    InputStream getInputStream() throws IOException;
}
public interface Resource extends InputStreamSource {
    boolean exists();

    boolean isReadable();

    boolean isOpen();

    URL getURL() throws IOException;

    URI getURI() throws IOException;

    File getFile() throws IOException;

    long lastModified() throws IOException;

    Resource createRelative(String var1) throws IOException;

    String getFilename();

    String getDescription();
}

InputStreamSource封裝任何能返回InputStream的類,比如File、Classpath下的資源和Byte Array等, 它只有一個方法定義:getInputStream(),該方法返回一個新的InputStream對象

Resource接口抽象了所有Spring內部使用到的底層資源:File、URL、Classpath等。首先,它定義了3個判斷當前資源狀態的方法:存在性(exists)、可讀性(isReadable)、是否處於打開狀態(isOpen)。另外,Resource接口還提供了不同資源到URL、URI、File類型的轉換,以及獲取lastModified屬性、文件名(不帶路徑信息的文件名,getFilename())的方法,爲了便於操作,Resource還提供了基於當前資源創建一個相對資源的方法:createRelative(),還提供了getDescription()方法用於在錯誤處理中的打印信息

對不同來源的資源文件都有相應的Resource實現:文件(FileSystemResource)、Classpath資源(ClassPathResource)、URL資源(UrlResource)、InputStream資源(InputStreamResource)、Byte數組(ByteArrayResource)等,相關類圖如下所示

 

 

 


 

 

分類: Spring學習(使用及源碼學習)

標籤: spring源碼 spring

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章