ListableBeanFactory

ListableBeanFactory接口是BeanFactory接口的一個擴展。實現了此接口的類一般都有預加載bean定義功能(從XML等配置文件中),因此都有能列舉其包含的所有Bean,根據名字或其它單個查找Bean的特性。
理論上講,即使此類的實現類同時也實現了HierarchicalBeanFactory,此接口中方法返回值也不應該考慮其父BeanFactory中的Bean,但是你可以通過BeanFactoryUtils工具類來獲取哪些在父BeanFactory中的Bean。
此接口中的所有方法只會考慮本BeanFactory實例中的Bean定義,除了getBeanNamesOfType和getBeanOfType以外,其他方法都不會考慮其他方法諸如的bean實例,諸如通過ConfigurableBeanFactory的registerSingleton方法配置的單例。這主要也是因爲getBean方法可以訪問這些手動配置的Bean定義。但是,通常情況下,所有的Bean都是通過外部的配置文件配置的,因此不必擔心以上這點區別。
需要注意的是,除了getBeanDefinitionCount和containsBeanDefinition外,此接口中其他方法的實現可能不會太高效,因此,不建議經常調用。

public interface ListableBeanFactory extends BeanFactory {

    /**
     * 查看是否包含指定名字的Bean
     * 不支持向上或向下查找
     * 不支持查找非配置文件定義的單例Bean
     */
    boolean containsBeanDefinition(String beanName);

    /**
     * 查看此BeanFactory中包含的Bean數量
     * 不支持向上或向下查找
     * 不支持查找非配置文件定義的單例Bean
     */
    int getBeanDefinitionCount();

    /**
     * 返回此BeanFactory中所包含的所有Bean定義的名稱
     * 不支持向上或向下查找
     * 不支持查找非配置文件定義的單例Bean
     */
    String[] getBeanDefinitionNames();

    /**
     * 返回此BeanFactory中所有指定類型的Bean的名字。判斷是否是指定類型的標準有兩個:a Bean定義。
     * b FactoryBean的getObjectType方法。
     * 只考慮最頂層的Bean,對於嵌套的Bean,即使符合類型也不予考慮
     * 會考慮FactoryBean創建出的Bean
     * 不支持向上或向下查找
     * 不支持查找非配置文件定義的單例Bean
     * 此簽名的getBeanNamesForType方法會返回所有Scope類型的Bean,在大多數的實現中,其返回結果和
     * 其重載方法getBeanNamesForType(type, true, true)返回結果一致。
     * 返回結果中,Bean名字的順序應該和其定義時一樣
     */
    String[] getBeanNamesForType(ResolvableType type);

    /**
     * 返回此BeanFactory中所有指定類型(或指定類型的子類型)的Bean的名字。判斷是否是指定類型的標準有
     * 兩個:a Bean定義,b FactoryBean的getObjectType方法。
     * 只考慮最頂層的Bean,對於嵌套的Bean,即使符合類型也不予考慮
     * 會考慮FactoryBean創建出的Bean
     * 不支持向上或向下查找
     * 不支持查找非配置文件定義的單例Bean
     * 此簽名的getBeanNamesForType方法會返回所有Scope類型的Bean,在大多數的實現中,其返回結果和
     * 其重載方法getBeanNamesForType(type, true, true)返回結果一致。
     * 返回結果中,Bean名字的順序應該和其定義時一樣
     */
    String[] getBeanNamesForType(Class<?> type);

    /**
     * 返回此BeanFactory中所有指定類型(或指定類型的子類型)的Bean的名字。判斷是否是指定類型的標準有
     * 兩個:a Bean定義,b FactoryBean的getObjectType方法。
     * 只考慮最頂層的Bean,對於嵌套的Bean,即使符合類型也不予考慮
     * 會考慮FactoryBean創建出的Bean
     * 不支持向上或向下查找
     * 不支持查找非配置文件定義的單例Bean
     * 此簽名的getBeanNamesForType方法會返回所有Scope類型的Bean,在大多數的實現中,其返回結果和
     * 其重載方法getBeanNamesForType(type, true, true)返回結果一致。
     * 返回結果中,Bean名字的順序應該和其定義時一樣
     * 如果Bean是通過FactoryBean創建的,那麼只考慮設置了allowEagerInit標誌位的Bean。如果
     * 沒有設置allowEagerInit標誌位,則只考慮FactoryBean的類型
     */
    String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);

    /**
     * 返回此BeanFactory中所有指定類型(或指定類型的子類型)的Bean的名字。判斷是否是指定類型的標準有
     * 兩個:a Bean定義,b FactoryBean的getObjectType方法。
     * 只考慮最頂層的Bean,對於嵌套的Bean,即使符合類型也不予考慮
     * 會考慮FactoryBean創建出的Bean
     * 不支持向上或向下查找
     * 不支持查找非配置文件定義的單例Bean
     * 此簽名的getBeanNamesForType方法會返回所有Scope類型的Bean,在大多數的實現中,其返回結果和
     * 其重載方法getBeanNamesForType(type, true, true)返回結果一致。
     * 返回結果中,Bean名字的順序應該和其定義時一樣
     */
    <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;

    /**
     * 返回此BeanFactory中所有指定類型(或指定類型的子類型)的Bean的名字。判斷是否是指定類型的標準有
     * 兩個:a Bean定義,b FactoryBean的getObjectType方法。
     * 只考慮最頂層的Bean,對於嵌套的Bean,即使符合類型也不予考慮
     * 會考慮FactoryBean創建出的Bean
     * 不支持向上或向下查找
     * 不支持查找非配置文件定義的單例Bean
     * 此簽名的getBeanNamesForType方法會返回所有Scope類型的Bean,在大多數的實現中,其返回結果和
     * 其重載方法getBeanNamesForType(type, true, true)返回結果一致。
     * 返回結果中,Bean名字的順序應該和其定義時一樣
     * 如果Bean是通過FactoryBean創建的,那麼只考慮設置了allowEagerInit標誌位的Bean。如果
     * 沒有設置allowEagerInit標誌位,則只考慮FactoryBean的類型
     * @see BeanFactoryUtils#beansOfTypeIncludingAncestors(ListableBeanFactory, Class, boolean, boolean)
     */
    <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
            throws BeansException;

    /**
     * 找到所有帶有指定註解類型的Bean
     */
    String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);

    /**
     * 找到所有帶有指定註解的Bean,返回一個以Bean的name爲鍵,其對應的Bean實例爲值的Map
     */
    Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;

    /**
     * 在指定name對應的Bean上找指定的註解,如果沒有找到的話,去指定Bean的父類或者父接口上查找
     */
    <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
            throws NoSuchBeanDefinitionException;

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