天天看點

『網際網路架構』軟體架構-spring源碼之spring ioc(九)

上次說了spring的體系結構和概要大概有哪些子產品,spring ioc是最核心最原始的一個架構,其實就是spring的老本,spring就是依靠着ioc,慢慢發展到其他Data,web,AOP上的。記得當初項目裡面使用spring的時候,就知道配置個xml,在struts2上引用spring配置的bean,引用這個類就可以直接用了,不用直接new了,完全不管原理,确實友善但是需要配置2次,一次是spring bean.xml,一次是struts引用的時候配置。這次主要看看spring IOC底層是如何實作的。

什麼是IOC

IoC 不是一種技術,隻是一種思想,一個重要的面向對象程式設計的法則,它能指導我們如何設計出松耦合、更優良的程式。傳統應用程式都是由我們在類内部主動建立依賴對象,進而導緻類與類之間高耦合,難于測試;有了IoC容器後,把建立和查找依賴對象的控制權交給了容器,由容器進行注入組合對象,是以對象與對象之間是 松散耦合,這樣也友善測試,利于功能複用,更重要的是使得程式的整個體系結構變得非常靈活。 說白了就是管理bean(Bean的建立,Bean的存儲,Bean的擷取)。

BeanFactory

BeanFactory是最基本的IOC容器接口,這個接口為具體的IOC容器的實作作了最基本的功能規定。
BeanFactory類結構體系
BeanFactory的源碼解析
spring Ioc容器的實作,從根源上是beanfactory,但真正可以作為一個可以獨立使用的ioc容器還是DefaultListableBeanFactory,是以可以這麼說, DefaultListableBeanFactory 是整個spring ioc的始祖,研究透它的前生今世對我們了解spring ioc的概念有着重要的作用。 Spring Bean的建立是典型的工廠模式,這一系列的Bean工廠,也即IOC容器為開發者管理對象間的依賴關系提供了很多便利和基礎服務,在Spring中有許多的IOC容器的實作供使用者選擇和使用,其互相關系如下:

管理Bean<BeanFactory>

Bean的建立

Bean的存儲

Bean的擷取

自動完成依賴的檢測和注入

自動生成Bean

富士康的蘋果手機,研發都是美國那邊統一來進行的。也就是說富士康工廠本身是不會定義咱們的蘋果手機的,都是由美國的研發對蘋果手機進行定義,然後富士康對手機進行生産,存儲,運輸。蘋果手機就類似咱們的bean。

Bean屬性的定義

name

id

scope(單例,多例)

className

parent

lazyInt

depends

property

bean定義存儲

xml

properties

spring提供了有兩種方式的bean definition解析器:PropertiesBeanDefinitionReader和XmLBeanDefinitionReader即屬性檔案格式的bean definition解析器和xml檔案格式的bean definition解析器。

加載檔案

轉換成Document

解析注冊Beandefinition

IOC容器的建構歸為以下六步

定義好Spring的配置檔案。

通過Resource對象将Spring配置檔案進行抽象,抽象成一個Resource對象。

定義好Bean工廠。

定義好XmlBeanDefinitionReader對象,并将工廠作為參數傳遞進去供後續回調使用。

通過XmlBeanDefinitionReader對象讀取之前抽象出的Resource對象(包含了XML檔案的解析過程)。本質上,XML檔案的解析是由XmlBeanDefinitionReader交由

BeanDefinitionParserDelegate委托來完成(用到了委托模式)

IoC容器建立完畢,使用者可以通過容器擷取到所需的對象資訊。

簡化版流程

裝載BeanDefinition到beanfactroy中

擷取bean的時候去getBeanDefinition

然後createBean

PS:讀源碼确實很麻煩,但是spring的源碼大概120多MB,相當于一個JAVA的JDK了,讀了怼咱們日常開發真的很有用,設計到的模式:單例模式,工廠模式,建造者模式。