spring(三):源碼解讀

1. 什麼是I0C/DI?

I0C (Inversion of Control)控制反轉:所謂控制反轉,就是把原先我們代碼裏面需要實現的對象創建、依賴的代碼,反轉給容器來幫忙實現。那麼必然的我們需要創建一個容器, 同時需要一種 描述來讓容器知道需要創建的對象與對象的關係。這個描述最具體表現就是我們可配置的文件。

DI (Dependency Injection)依賴注入:就是指對象是被動接受依賴類而不是自己主動去找,換句話說就
是指對象不是從容器中查找它依賴的類,而是在容器實例化對象的時候主動將它依賴的類注入給它。
先從我們自己設計這樣-一個視角來考慮:
對象和對象關係怎麼表示?
可以用xml,properties文件 等語義化配置文件表示。
描述對象關係的文件存放在哪裏?
可能是classpath,filesystem, 或者是URL 網絡資源,servletContext等。
回到正題,有了配置文件,還需要對配置文件解析。

不同的配置文件對對象的描述不一樣,如標準的,自定義聲明式的,如何統-一?在內部需要有一個統一的關於對象的定義,所有外部的描述都必須轉化成統一的描述定義。
如何對不同的配置文件進行解析?需要對不同的配置文件語法,採用不同的解析器

2. Spring I0C 體系結構

(1) BeanFactory

  Spring Bean的創建是典型的工廠模式,這一系列的Bean工廠,也即I0C容器爲開發者管理對象間的依賴關係提供了很多便利和基礎服務,在Spring中有許多的I0C容器的實現供用戶選擇和使用,其相互關係如下:

在這裏插入圖片描述

  其中BeanFactory作爲最頂層的一個接口類,它定義了IOC容器的基本功能規範,BeanFactory 有三個子類: ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。但是從上圖中我們可以發現最終的默認實現類是DefaultListableBeanFactory, 他實現了所有的接口。那爲何要定義這麼多層次的接口呢? 查閱這些接口的源碼和說明發現,每個接口都有他使用的場合,它主要是爲了區分在Spring內部在操作過程中對象的傳遞和轉化過程中,對對象的數據訪問所做的限制。例如ListableBeanFactory 接口表示這些Bean 是可列表的, 而 HierarchicalBeanFactory表示的是這些 Bean是有繼承關係的,也就是每個Bean有可 能有父 Bean。AutowireCapableBeanFactory接口定義Bean 的自動裝配規則。這四個接口共同定義了Bean 的集合、Bean之間的關係、 以及Bean行爲。

最基本的IOC容器接口:BeanFactory

public interface BeanFactory {

	// 對FactoryBean的轉義定義,因爲如果使用bean的名字檢索FactoryBean得到的對象是工廠生成的對象,//如果需要得到工廠本身,需要轉義
	String FACTORY_BEAN_PREFIX = "&";
	
	// 根據bean的名字,獲取在IOC容器中得到bean實例
	Object getBean(String name)  throws BeansException;
	
	// 根據bean的名字和Class類型來得到bean實例,增加了類型安全驗證機制。
	Object getBean(String name, Class reguiredType)  throws BeansException;
	
	// 提供對bean的檢索,看看是否在IOC容器有這個名字的bean
	boolean containsBean(String name);

	// 根據bean名字得到bean實例,並同時判斷這個bean是不是單例
	boolean isSingleton(String name)  throws NoSuchBeanDef initi onException;

	// 得到bean實例的Class類型
	Class getType(String name)  throws NoSuchBeanDefinitionException;
	
	// 得到bean的別名,如果根據別名檢索,那麼其原名也會被檢索出來
	String[] getAliases(String name);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章