ListableBeanFactory是BeanFactory的子类,对BeanFactory进行扩展,由可以枚举所有bean实例的bean工厂实现,而不是按客户端要求按Bean名称逐个查询bean。
预加载所有bean定义(例如基于XML的工厂)的Bean工厂实现可以实现此接口。
如果这是一个{@link HierarchicalBeanFactory},返回值将不考虑任何BeanFactory层次结构,但是仅与当前工厂中定义的bean相关。
使用{@ Link BeanFactoryUtils}助手类也可以考虑祖先工厂中的bean。
此接口中的方法将仅关心该工厂的bean定义。它们将忽略任何其他已被其他方式注册的单例bean。
BeanFactory的{@代码GetBean }也允许对这种特殊bean的透明访问。然而,在典型的场景中,所有bean都将由外部bean定义来定义,因此大多数应用程序不需要担心这种差异。
除了{@code getBeanDefinitionCount}和{@code containsBeanDefinition}该接口中的方法不是为频繁调用而设计的。实现可能是缓慢的
boolean containsBeanDefinition(String beanName);检查此bean工厂是否包含具有给定名称的bean定义,不考虑此工厂可能参与的任何层次结构,并忽略通过bean定义以外的其他方法注册的任何单例bean。
int getBeanDefinitionCount();返回工厂中定义的bean的数量。不考虑此工厂可能参与的任何层次结构,并忽略通过bean定义以外的其他方法注册的任何单例bean。
String[] getBeanDefinitionNames();返回此工厂中定义的所有bean的名称。不考虑此工厂可能参与的任何层次结构,并忽略通过bean定义以外的其他方法注册的任何单例bean。
String[] getBeanNamesForType(ResolvableType type);根据bean定义或FactoryBeans中的{@code getObjectType}值返回与给定类型(包括子类)匹配的bean的名称。此方法只对顶级bean进行内省。它不检查与指定类型匹配的嵌套bean。考虑由FactoryBeans创建的对象,这意味着FactoryBeans将被初始化。如果由FactoryBean创建的对象不匹配,原始FactoryBean本身将与类型匹配。不考虑该工厂可能参与的任何层次结构。不忽略bean定义之外的其他方法注册的单例bean。这个版本的{@code getBeanNamesForType}与各种bean相匹配,无论是singletons、prototypes还是FactoryBeans。在大多数实现中,结果将与{@code getBeanNamesForType(type, true, true)}相同。此方法返回的Bean名称应尽可能按照后端配置中的定义顺序返回bean名称。
ResolvableType 参考这篇文章 https://www.jianshu.com/p/456b1b6ea51f
String[] getBeanNamesForType(Class<?> type); 同上
String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);根据bean定义或FactoryBeans中的{@code getObjectType}值返回与给定类型(包括子类)匹配的bean的名称。此方法只对顶级bean进行内省。它不检查与指定类型匹配的嵌套bean。考虑由FactoryBeans创建的对象,如果allowEagerInit为TRUE这意味着FactoryBeans将被初始化。如果由FactoryBean创建的对象不匹配,原始FactoryBean本身将与类型匹配。如果allowEagerInit为FALSE,只有原始FactoryBean本身将与类型匹配,不需要初始化每个FactoryBean。不考虑该工厂可能参与的任何层次结构。不忽略bean定义之外的其他方法注册的单例bean。此方法返回的Bean名称应尽可能按照后端配置中的定义顺序返回bean名称。
<T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
<T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
throws BeansException;
String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);查找其{@code Class}具有所提供的{@link Annotation}类型的所有bean,而不创建任何bean实例。
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;查找其{@code Class}具有所提供的{@link Annotation}类型的所有bean,返回具有相应bean实例的bean名称映射。
<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
throws NoSuchBeanDefinitionException;在指定的bean上查找{@code annotationType}的{@link Annotation},如果给定类本身上找不到annotation,则遍历它的接口和超类。