ListableBeanFactory在BeanFactory的位置见《Spring源码阅览——BeanFactory体系结构》
ListableBeanFactory:同样扩展BeanFactory使其支持迭代Ioc容器持有的Bean对象。注意如果ListableBeanFactory同时也是HierarchicalBeanFactory,那么大多数情况下,只迭代当前Ioc容器持有的Bean对象,不会在体系结构中想父级递归迭代。具体情况请看API说明。
package org.springframework.beans.factory; /** * 该接口是对BeanFactory的扩展,允许预加载bean定义的BeanFactory可以实现此接口 * 其目的在于使实现它的BeanFactory能够枚举所有的Bean * 该接口不支持分层结构(对于继承了HierarchicalBeanFactory的BeanFactory来说) * 也即该接口只能枚举当前facotry的Bean * 除getBeanNamesOfType,getBeansOfType方法外,其他方法也将忽略由SingletonBeanRegistry的方法 * 注册的Singleton Bean * 除getBeanDefinitionCount和containsBeanDefinition外的方法不要频繁使用,性能很慢 */ public interface ListableBeanFactory extends BeanFactory { /** * 根据给出的BeanName判断是否包含该Bean定义 * 该接口不支持分层结构(对于继承了HierarchicalBeanFactory的BeanFactory来说) * 也即该接口只能枚举当前facotry的Bean 忽略由SingletonBeanRegistry的方法 注册的Singleton Bean */ boolean containsBeanDefinition(String beanName); /** * 返回Bean定义的数目 该接口不支持分层结构(对于继承了HierarchicalBeanFactory的BeanFactory来说) * 也即该接口只能枚举当前facotry的Bean 忽略由SingletonBeanRegistry的方法 注册的Singleton Bean */ int getBeanDefinitionCount(); /** * 返回所有Bean的BeanName组成的String数组 */ String[] getBeanDefinitionNames(); /** * 根据提供的类型返回匹配的BeanName数组 只检测顶层Bean,忽略嵌套Bean * 对于FactoryBean,当提供的类型匹配FactoryBean.getObjectType时返回BeanName * 当提供的类型匹配FactoryBean时返回&BeanName * 该接口不支持分层结构(对于继承了HierarchicalBeanFactory的BeanFactory来说) * 也即该接口只能枚举当前facotry的Bean 不忽略由SingletonBeanRegistry的方法时注册的Singleton Bean * 不检测无法实例化的Bean(如抽象Bean) */ String[] getBeanNamesForType(ResolvableType type); /** * 同上 String[] getBeanNamesForType(@Nullable Class<?> type); * * /** 作用同上 includeNonSingletons:判断是否匹配除Singleton外的其他scope allowEagerInit: * false只匹配FactoryBean本身,true时还匹配FactoryBean.getObjectType() */ String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit); /** * 根据提供的类型返回匹配的Bean实例数组 只检测顶层Bean,忽略嵌套Bean * 对于FactoryBean,当提供的类型匹配FactoryBean.getObjectType时返回BeanName * 当提供的类型匹配FactoryBean时返回&BeanName * 该接口不支持分层结构(对于继承了HierarchicalBeanFactory的BeanFactory来说) * 也即该接口只能枚举当前facotry的Bean 不忽略由SingletonBeanRegistry的方法时注册的Singleton Bean * 不检测无法实例化的Bean(如抽象Bean) */ <T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException; /** * 作用同上 includeNonSingletons:判断是否匹配除Singleton外的其他scope allowEagerInit: * false只匹配FactoryBean本身,true时还匹配FactoryBean.getObjectType() */ <T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException; /** * 根据提供的注解类型找到对于的BeanName数组, 不创建实例, 但FactoryBean类型将被初始化,因为该方法考虑FactoryBean创建的对象 */ String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType); /** * 根据提供的注解类型找到对于的Bean实例数组, FactoryBean类型将被初始化,因为该方法考虑FactoryBean创建的对象 */ Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException; /** * 根据提供的注解类型和beanNaeme找到对应的Bean,Bean的类类型本身找不到,则遍历它的 接口和超类 * 如果不存在该Bean,则抛出NoSuchBeanDefinitionException 如果该Bean不支持该注解类型则返回null */ @Nullable <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws NoSuchBeanDefinitionException; }