简介
ListableBeanFactory 是 Spring 框架中 BeanFactory 接口的一个扩展。它提供了额外的功能,允许你查询和操作在容器中定义的 bean 的列表。这个接口继承自 BeanFactory,并添加了一些新的方法,如 getBeanNamesForType(Class<?> type) 和 getBeansOfType(Class<?> type),这些方法允许你基于类型来获取 bean 的名称和实例。
ListableBeanFactory 的主要方法包括:
- getBeanNamesForType(Class<?> type): 返回给定类型的所有 bean 名称的数组。
- getBeansOfType(Class<?> type): 返回给定类型的所有 bean 实例的映射。键是 bean 名称,值是 bean 实例。
- getBeanNamesForType(Class<?> type, boolean allowEagerInit, boolean allowSingletonPrototypes): 类似于
- getBeanNamesForType(Class<?> type),但提供了额外的参数来控制是否允许早期初始化和单例原型 bean。
- getBeansOfType(Class<?> type, boolean allowEagerInit, boolean allowSingletonPrototypes): 类似于 getBeansOfType(Class<?> type),但提供了额外的参数来控制是否允许早期初始化和单例原型 bean。
- containsBeanDefinition(String name): 检查容器中是否包含具有给定名称的 bean 定义。
- isSingleton(String name): 检查具有给定名称的 bean 是否是单例。
- isPrototype(String name): 检查具有给定名称的 bean 是否是原型。
- isTypeMatch(String name, Class<?> targetType): 检查具有给定名称的 bean 是否与目标类型匹配。
- getDependencyDescriptors(String beanName): 返回给定 bean 名称的依赖描述符列表。
ListableBeanFactory 通常不直接由应用程序代码使用,而是由 Spring 的内部组件和高级框架功能使用。然而,对于需要查询和操作 bean 的高级用例,例如自定义的 bean 后处理器或框架扩展,ListableBeanFactory 可能是有用的。
在实际开发中,ApplicationContext 是更常用的接口,因为它提供了 ListableBeanFactory 的所有功能,并添加了其他许多有用的功能,如国际化支持、事件传播等。如果你正在编写普通的 Spring 应用程序代码,你通常会与 ApplicationContext 交互,而不是直接与 ListableBeanFactory 交互。
源码
public interface ListableBeanFactory extends BeanFactory {
boolean containsBeanDefinition(String var1);
//获取BeanDefinition的总数
int getBeanDefinitionCount();
//获取Bean名字的集合
String[] getBeanDefinitionNames();
//获取指定类型Bean名字的集合
String[] getBeanNamesForType(ResolvableType var1);
//根据这个类型获取这个类型的所有bean的beanName
String[] getBeanNamesForType(@Nullable Class<?> var1);
String[] getBeanNamesForType(@Nullable Class<?> var1, boolean var2, boolean var3);
//根据类型(包括子类)返回指定Bean名和Bean的Map
<T> Map<String, T> getBeansOfType(@Nullable Class<T> var1) throws BeansException;
<T> Map<String, T> getBeansOfType(@Nullable Class<T> var1, boolean var2, boolean var3) throws BeansException;
//根据注解类型,查找Bean
String[] getBeanNamesForAnnotation(Class<? extends Annotation> var1);
//根据注解类型,查找Bean名和Bean的Map
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> var1) throws BeansException;
@Nullable
<A extends Annotation> A findAnnotationOnBean(String var1, Class<A> var2) throws NoSuchBeanDefinitionException;
}