Spring原始碼總結與分析
前言
Spring是什麼?它是一個應用程式框架,為應用程式的開發提供強大的支援,例如對事務處理和持久化的支援等;它也是一個bean容器,管理bean物件的整個生命週期,維護bean的各種存在狀態,例如bean物件的例項化、銷燬、bean的單例項和多例項狀態等。
Spring作為Java發展史上不可忽視的存在,說他重新定義了Java也不為過。它功能強大,著實為日常開發提供了大大的便利。表面越簡單的東西,背後越複雜。
從本章節開始,我們一起分析Spring的原始碼,看它到底是怎麼樣來實現我們常說常用的諸如IOC、Annotation、AOP、事務等功能的。
小編給大家推薦一個Java技術交流群:937053620!群內提供設計模式、spring/mybatis原始碼分析、高併發與分散式、微服務、效能優化,面試題整合文件等免費資料!給大家提供一個交流學習的平臺!
Spring的整體架構:
這些模組被總結為以下幾個部分:
- Core Container
Core Container(核心容器)包含有Core、Beans、Context和Expression Language模組
Core和Beans模組是框架的基礎部分,提供IoC(轉控制)和依賴注入特性。這裡的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程式性單例模式的需要,並真正地允許你從程式邏輯中分離出依賴關係和配置
- Data Access/Integration
JDBC模組提供了一個JDBC抽象層,它可以消除冗長的JDBC編碼和解析資料庫廠商特有的錯誤程式碼,ORM模組為流行的物件-關係對映API,如JPA、JDO、Hibernate、iBatis等,提供了一個互動層
- Web
Web上下文模組建立在應用程式上下文模組之上,為基於Web的應用程式提供了上下文,所以Spring框架支援與Jakarta Struts的整合。Web模組還簡化了處理多部分請求以及將請求引數繫結到域物件的工作。
- AOP
AOP模組提供了一個符合AOP聯盟標準的面向切面程式設計的實現,它讓你可以定義例如方法攔截器和切點,從而將邏輯程式碼分開,降低它們之間的耦合性,利用source-level的元資料功能,還可以將各種行為資訊合併到你的程式碼中
- Test
Test模組支援使用Junit和TestNG對Spring元件進行測試
容器的基本實現
Spring的結構組成
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介面。
類圖中各個類的作用:
- 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註冊後的處理
Spring bean作用域與生命週期
Spring通過new關鍵字將一個Bean進行例項化,Spring根據xml檔案中的配置通過呼叫Bean中的setXXX方法填入對應的屬性、事件通知。
Spring依次檢查Bean是否實現了BeanNameAware、BeanFactoryAware、ApplicationContextAware、BeanPostProcessor、InitializingBean介面,如果有的話,依次呼叫這些介面使用。應用程式可以正常使用這個Bean了。銷燬:如果Bean實現了DisposableBean介面,就呼叫其destroy方法。
BeanDefinition的載入和解析
對IoC容器來說,這個載入過程,相當於把定義的BeanDefinition在IoC容器中轉化成一個Spring內部表示的資料結構的過程。IoC容器對Bean的管理和依賴注入功能的實現,是通過對其持有的BeanDefinition進行各種相關操作來完成的。這些BeanDefinition資料在IoC容器中通過一個HashMap來保持和維護。
Spring容器初始化過程
spring的IoC容器初始化包括:Bean定義資原始檔的定位、載入和註冊3個基本過程。
當 BeanDefinition 註冊完畢以後, Spring Bean 工廠就可以隨時根據需要進行例項化了。對於 XmlBeanFactory 來說,例項化預設是延遲進行的。
如何啟動spring容器
在Web專案中,啟動Spring容器的方式有三種,ContextLoaderListener、ContextLoadServlet、ContextLoaderPlugin。
最後
其實做為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要這裡我推薦一個Java交流群937053620,不管你是小白還是大牛歡迎入駐,大家一起交流成長