Spring源碼分析-IOC容器BeanFactory的應用場景

BeanFactory提供的是最基本的IOC容器的功能,關於這些功能定義,我們可以在接口BeanFactory中看到。

BeanFactory接口定義了IOC容器最基本的形式,並且提供了IOC容器所應該遵守的最基本的服務契約,同時,這也是我們使用IOC容器所應遵守的最底層和最基本的編程規範,這些接口定義勾畫出了IOC的基本輪廓。很顯然,在Spring的代碼實現中,BeanFactory只是一個接口類,並沒有給出容器的具體實現,而我們在圖1中看到的各種具體類,比如
DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等都可以看成是容器附加了某種功能的具體實現,也就是容器體系中的具體容器產品。下面我們來看看圖1中BeanFactory是怎樣定義IOC容器的基本接口的。

Spring源碼分析-IOC容器BeanFactory的應用場景

圖1

用戶使用容器時,可以使用轉義符"&"來得到FactoryBean本身,用來區分通過容器來獲取的FactoryBean產生的對象和獲取FactoryBean本身。舉例來說,如果myJndiObject是一個FactoryBean,那麼使用&myJndiObject得到的是FactoryBean,而不是myJndiObject這個FactoryBean產生出來的對象。關於具體的FactoryBean的設計和實現模式,我們會在後面的內容中介紹。

注意:理解上面的這段話需要很好的區分FactoryBean和BeanFactory這兩個在Spring中使用頻率很高的類,它們在拼寫上非常相似。一個是Factory,也就是IOC容器或對象工廠;一個是Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)來進行管理的。但對FactoryBean而言,這個Bean部署簡單的Bean,而是一個能生產或者修飾對象生成的工廠Bean,它的實現與設計模式中的工廠模式和修飾器模式類似。

BeanFactory接口設計了getBean方法,這個方法是使用IOC容器API的主要方法,通過這個方法,可以取得IOC容器管理中管理的Bean,Bean的取得是通過指定的名字來索引的。如果需要在獲取Bean時需要對Bean的類型進行檢查,BeanFactory接口定義了帶有參數的getBean方法,這個方法使用與不帶參數的getBean方法類似,不同的是增加了對Bean檢索的類型的要求。

用戶可以通過BeanFactory接口方法中的getBean來使用Bean的名字,從而在獲取Bean時,如果需要獲取的Bean是prototype類型的,用戶還可以爲這個protoptype類型的Bean生成指定 構造函數對應參數。這使得在一定程度上可以控制生成protopyte類型的Bean。有了BeanFactory的定義,用戶可以執行以下操作:

1.通過接口方法cotainsBean讓用戶能夠判斷容器是否含有指定名字的Bean。

2.通過接口方法isSingleton來查詢指定名字的Bean是否是Singleton類型的Bean。對於Singleton屬性,用戶可以在BeanDefinition中指定。

3.通過接口方法isProtopyte來查詢指定名字的Bean是否是Protopyte類型的Bean。對於Protopyte屬性,用戶同樣可以在BeanDefinition中指定。

4.通過接口方法isTypeMatch來查詢指定了名字的Bean的Class類型是否是特定的Class類型。這個Class類型可以由用戶來指定。

5.通過接口方法getType來查詢指定名字的Bean的Class類型。

6.通過接口方法getAliases來查詢指定了名字的Bean的所有別名,這些別名都是用戶在BeanDefinition中定義的。

這些定義的接口方法勾畫出了IOC容器的基本特性。因爲這個BeanFactory接口定義了IOC容器,所以下面給出了它定義的全部內容供大家參考,如下:

public interface BeanFactory {

    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String name) throws BeansException;

    <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;

    boolean containsBean(String name);
    
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

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

    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    String[] getAliases(String name);

}

可以看到,這裏定義的只是一系列的接口方法,通過一系列的BeanFactory接口,可以使用不同的Bean檢索方法,很方便的從IOC容器中得到需要的Bean,從而忽略具體的IOC容器的實現,從這個角度上看,這些檢索方法代表的是最爲基本的容器入口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章