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