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都是开发中常用的方法