1. 程式人生 > >Spring原始碼——BeanFactory

Spring原始碼——BeanFactory

一、BeanFactory的繼承體系:
在這裡插入圖片描述
其中BeanFactory作為最頂層的一個介面類,它定義了IOC容器的基本功能規範,BeanFactory有三個子類:ListableBeanFactory、HierarchicalBeanFactory、AutowireCapableBeanFactory。
但是從上圖中我們可以發現最終的預設實現類是DefaultListableBeanFactory,他實現了所有的介面。那為何要定義這麼多層次的介面呢?查閱這些介面的原始碼和說明發現,每個介面都有他使用的場合,他主要是為了區分在Spring內部在操作過程中物件的傳遞和轉化過程中,對物件的資料訪問所做的限制。
例如,ListableBeanFactory 介面表示這些Bean是可列表的,而HierarchicalBeanFactory 表示的是這些Bean是有繼承關係的,也就是每個Bean有可能有父Bean。
AutowireCapableBeanFactory 介面定義Bean的自動裝配規則。這四個介面共同定義了Bean 的集合、Bean之間的關係、以及Bean的行為。
最基本的IOC容器介面BeanFactory。
下面是通過Eclipse檢視的spring-beans的原始碼:在這裡插入圖片描述


接口裡面的方法與屬性:

	//對FactoryBean的轉義定義,因為如果使用bean的名字檢索FactoryBean得到的物件是工廠生成的物件,
	//如果需要得到工廠本身,需要轉義
	String FACTORY_BEAN_PREFIX = "&";
	
	//根據bean的名字,在IOC容器中得到bean例項
	Object getBean(String name) throws BeansException;

	//根據bean的名字和class型別來得到bean例項,增加了型別安全驗證機制
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;

	<T> T getBean(Class<T> requiredType) throws BeansException;

	Object getBean(String name, Object... args) throws BeansException;

	//提供對bean的檢索,看看是否在IOC容器中有這個名字的bean
	boolean containsBean(String name);

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

	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;

	//得到bean例項的Class型別
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	//得到bean的別名,如果根據別名檢索,name其原名也會被檢索出來
	String[] getAliases(String name);

      在BeanFactory裡只對IOC容器的基本行為作了定義,根本不關心你的bean是如何定義怎樣載入的。

正如我們只關心工廠裡得到的是什麼產品物件,至於工廠是怎麼生產這些物件的,這個基本的介面不關心。
而要知道工廠是如何產生物件的,我們需要看具體的IOC容器實現,Spring提供了許多IOC容器的實現。比如XmlBeanFactory,ClassPathXmlApplicationContext等。其中XmlBeanFactory就是針對最基本的IOC容器的實現,這個IOC容器可以讀取XML檔案定義的BeanDefinition(XML檔案中對bean的描述),如果說XmlBeanFactory是容器中的屌絲,ApplicationContext應該算容器中的高富帥了。
ApplicationContext是Spring提供的一個高階的IOC容器,它除了能夠提供IOC容器的基本功能外,還為使用者提供了以下的附加服務。
從ApplicationContext介面的實現,我們可以看出其特點:
1.支援資訊源,可以實現國際化(實現MessageSource介面)。
2.訪問資源。(實現ResourcePatternResolver介面)。
3.支援應用事件(實現ApplicationEventPublisher介面)。
)2、BeanDefinition (Bean的定義)
SpringIOC容器管理了我們定義的各種Bean物件及其相互的關係,Bean物件再Spring實現中是以BeanDefinition來描述的,其繼承體系如下:
在這裡插入圖片描述