《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