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來描述的,其繼承體系如下: