上次說了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了,讀了怼咱們日常開發真的很有用,設計到的模式:單例模式,工廠模式,建造者模式。