Spring之3:ListableBeanFactory

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;

}
原文地址:https://www.cnblogs.com/duanxz/p/5426649.html