springIOC源码接口分析(五):ListableBeanFactory

一 继承关系

该接口是对BeanFactory的扩展,允许预加载bean定义的BeanFactory可以实现此接口 其目的在于使实现它的BeanFactory能够枚举所有的Bean 该接口不支持分层结构(对于继承了HierarchicalBeanFactory的BeanFactory来说) 也即该接口只能枚举当前facotry的Bean 除getBeanNamesOfType,getBeansOfType方法外,其他方法也将忽略由SingletonBeanRegistry的方法 注册的Singleton Bean 除getBeanDefinitionCount和containsBeanDefinition外的方法不要频繁使用,性能很慢

二 定义方法

        /**
         根据给出的BeanName判断是否包含该Bean定义,忽略由SingletonBeanRegistry的方法注册的Singleton Bean
         */
        boolean containsBeanDefinition(String beanName);

        /**
         返回Bean定义的数目,忽略由SingletonBeanRegistry的方法注册的Singleton Bean
         */
        int getBeanDefinitionCount();

        /**
         返回所有Bean的BeanName组成的String数组
         */
        String[] getBeanDefinitionNames();

        /**
         根据提供的类型返回匹配的BeanName数组
         只检测顶层Bean,忽略嵌套Bean
         对于FactoryBean,当提供的类型匹配FactoryBean.getObjectType时返回BeanName
         当提供的类型匹配FactoryBean时返回&BeanName
         */
        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
         */
        <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;

由于ApplicationContext实现了这个接口,所以ApplicationContext实现的容器都可以调用这些方法,根据类型获取Bean都是开发中常用的方法

posted @ 2019-11-12 18:25  侯小厨  阅读(514)  评论(0编辑  收藏  举报
Fork me on Gitee