1. 程式人生 > >Spring原始碼總結與分析

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包的層級結構:

  1. src/main/java 用於展現Spring的主要邏輯
  2. src/main/resources 用於存放系統的配置檔案
  3. src/test/java 用於對主要邏輯進行單元測試
  4. 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,不管你是小白還是大牛歡迎入駐,大家一起交流成長