【源码】Spring —— BeanFactory 解读 1 BeanFactory 系列接口
- 前言
- 版本
- BeanFactory
-
- HierarchicalBeanFactory
- ListableBeanFactory
- AutowireCapableBeanFactory
-
- ConfigurableBeanFactory
-
- ConfigurableListableBeanFactory
- 总结
前言
BeanFactory
,字面意思:
bean工厂
,事实上,我们获取的
bean
就是由该接口的实现类生产,它维护所有的
bean
实例,并提供对应的方法
本章节罗列
BeanFactory
相关接口,从定义的方法认知整体接口
版本
Spring 5.3.x
BeanFactory
public interface BeanFactory {
/**
* 标识获取 FactoryBean 本身的前缀 &
* 比如:getBean("&a") 是获取 name = a
* 的 FactoryBean 本身
*/
String FACTORY_BEAN_PREFIX = "&";
/**
* 根据指定 name 获取 bean
* 支持 别名检索 | 父BeanFactory 检索
* @param requiredType 指定 bean 的类型
* @param args 指定构造 bean 实例对应的参数,如果获取到多个,会抛异常
*/
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
/**
* 略
*/
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
/**
* 当前 beanFactory 中是否存在指定 name 对应的 BeanDefinition
* 或者 单例实例
* 支持 别名检索 | 父beanFactory 检索
* 注意:返回 true 并不意味着 getBean 可以获取到对应的 bean
*/
boolean containsBean(String name);
/**
* 指定 name 的 bean 是否是 单例
* 不是 单例 也不意味着是 原型
* 支持 别名检索 | 父beanFactory 检索
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
/**
* 指定 name 的 bean 是否原型,同 isSingleton
*/
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
/**
* 指定 name 对应的 bean 是否匹配给定 ResolvableType
* 支持 别名检索 | 父beanFactory
*/
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
/**
* 返回指定 name 的 bean 的类型
* 如果是个 FactoryBean,则返回的是它内部对象的类型,
* 但是如果内部类型没有被提前暴露,则依据参数
* allowFactoryBeanInit 决定是否要提前初始化
* 当前 FactoryBean 以获取内部类型
*/
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
/**
* 返回指定 beanName 的所有别名
* 如果指定的 beanName 也是一个别名,会返回原始 name 和所有 别名
* 的数组(原始 name 在数组首位)
* 会同时在父 beanFactory 检索
*/
String[] getAliases(String name);
}
- 定义获取
本身的前缀FactoryBean
&
- 定义一组
方法获取getBean
实例,这种设计方法很通用,内部实现最终都会收口到一个方法上,对 调用者友好bean
- 值得一提的是,
方法返回containsBean
并不意味这true
可以获取对应的getBean
实例bean
- 上述检索方法都支持
,同时也会去别名检索
中检索父BeanFactory
- 其他方法见注释
HierarchicalBeanFactory
public interface HierarchicalBeanFactory extends BeanFactory {
// 返回 父BeanFactory
@Nullable
BeanFactory getParentBeanFactory();
/**
* 跟 BeanFactory#containsBean 类似,该方法只检索
* 当前 BeanFactory,而不会去 父BeanFactory 检索
* @param name
* @return
*/
boolean containsLocalBean(String name);
}
BeanFactory
的
子接口
:
- 提供了层级关系维护,
用于获取getParentBeanFactory
父BeanFactory
-
不同于containsLocalBean
,只会在当前层级中判断是否存在指定BeanFactory#containsBean
的name
bean实例
ListableBeanFactory
public interface ListableBeanFactory extends BeanFactory {
/**
* 当前层级是否包含指定 beanName 对应的 BeanDefinition
*/
boolean containsBeanDefinition(String beanName);
// 返回当前层级所有 BeanDefinition 个数
int getBeanDefinitionCount();
// 返回当前层级所有 BeanDefinition 名称数组
String[] getBeanDefinitionNames();
// 略
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType, boolean allowEagerInit);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType, boolean allowEagerInit);
/**
* 获取当前层级指定类型的 beanName 数组
* @param type
* @param includeNonSingletons 是否包括非单例
* @param allowEagerInit 是否需要初始化懒加载单例|FactoryBean
* @return
*/
String[] getBeanNamesForType(ResolvableType type);
String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit);
String[] getBeanNamesForType(@Nullable Class<?> type);
String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
/**
* 获取当前层级指定类型的所有 bean 实例,name -> bean实例
* @param type
* @param includeNonSingletons 是否包括非单例
* @param allowEagerInit 是否需要初始化懒加载单例|FactoryBean
* @param <T>
* @return
* @throws BeansException
*/
<T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;
<T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
throws BeansException;
// 返回标注了指定 注解 的 beanName 数组
String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
// 返回标注了指定 注解 的 bean示例集合:name -> bean实例
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
/**
* 依次从 指定bean 其父类 接口 和 工厂方法 上获取指定注解
*/
@Nullable
<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
throws NoSuchBeanDefinitionException;
}
BeanFactory
的
子接口
:
- 拓展了
功能,提供了多重维度的枚举
方法,详情见注释get
- 这些方法都仅限于当前层级的
,如果需要考虑父级,可以借助枚举
BeanFactoryUtils
-
containsBeanDefinition
getBeanDefinitionCount
这几个方法是完全基于当前getBeanDefinitionNames
中的BeanFactory
的,换句话说,对于我们通过BeanDefinition
等方法注册的registerSingleton
实例,它们是不感知的bean
-
getBeanNamesForType
方法是会感知自行注册getBeansOfType
实例的,当然大多数场景的bean
实例都是基于bean
扫描的BeanDefinition
-
getBeanDefinitionCount
基于性能问题不建议直接调用containsBeanDefinition
AutowireCapableBeanFactory
public interface AutowireCapableBeanFactory extends BeanFactory {
// 默认注入模式,也就是基于注解的注入
int AUTOWIRE_NO = 0;
// 基于 name 注入
int AUTOWIRE_BY_NAME = 1;
// 基于类型注入
int AUTOWIRE_BY_TYPE = 2;
// 推断构造方法后注入
int AUTOWIRE_CONSTRUCTOR = 3;
// 自动检测 @Deprecated
@Deprecated
int AUTOWIRE_AUTODETECT = 4;
// 通过此后缀获取原始实例(比如 代理实例的 target)
String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";
// 创建、填充 bean实例 相关方法
/**
* 创建指定类型的 bean实例:包括 实例创建、带有注解属性的注入、
* 各种初始化回调,还有 BeanPostProcessors 的执行
*/
<T> T createBean(Class<T> beanClass) throws BeansException;
/**
* 填充指定 bean实例:执行实例化后回调、属性处理(注解注入)
* 本质上是为了给新实例 | 反序列化实例 (重新)填充注解注入的字段和方法
*/
void autowireBean(Object existingBean) throws BeansException;
/**
* 配置给定 bean实例:属性注入、property values 应用、工厂回调执行、post processors 执行
*/
Object configureBean(Object existingBean, String beanName) throws BeansException;
// 更加细粒度控制 bean 生命周期的方法
/**
* 基于 autowireMode 创建 bean实例
*/
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
/**
* 基于 autowireMode 实例化指定 bean实例
*/
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
/**
* 基于 autowireMode 注入指定 bean实例 的属性
*/
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
throws BeansException;
/**
* 执行给定 beanName 对应 BeanDefinition 的 property values
*/
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
/**
* 初始化给定 bean:执行工厂回调、执行所有 post processors
*/
Object initializeBean(Object existingBean, String beanName) throws BeansException;
// 执行给定 bean实例 的所有 BeanPostProcessor#postProcessBeforeInitialization
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException;
// 执行给定 bean实例 的所有 BeanPostProcessor#postProcessAfterInitialization
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException;
// 销毁指定 bean实例
void destroyBean(Object existingBean);
// 基于 name type 的依赖解析,可以理解为针对属性获取待注入的 bean实例
<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;
Object resolveBeanByName(String name, DependencyDescriptor descriptor) throws BeansException;
@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;
@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,
@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;
}
BeanFactory
的
子接口
:
- 拓展了
能力自动装配
- 它的能力被单独拎出来,因此允许非
组件的实例也借助它来实现Spring
自动装配
- 在
上下文中,可以通过ApplicationContext
获取该实例,当然也可以获取ApplicationContext#getAutowireCapableBeanFactor
进行类型转换BeanFactory
- 它定义了不同的粒度生命周期的相关方法,详细见注释
ConfigurableBeanFactory
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry
HierarchicalBeanFactory
的子接口,拓展了配置能力,这是
Spring
常用的类设计模式,这一层抽象了所有
BeanFactory
类相关组件的配置,比如:
-
:BeanExpressionResolver
解析器SpEL
-
:转换服务ConversionService
-
:支持添加PropertyEditorRegistrar
以注册PropertyEditorRegistrar
PropertyEditor
-
:类型转换的顶层接口,相当于整合了TypeConverter
和ConversionService
PropertyEditorRegistry
-
:支持添加StringValueResolver
来解析处理字符串StringValueResolver
-
:支持添加BeanPostProcessor
对BeanPostProcessor
进行后处理bean实例
- 另外还提供了诸如
getMergedBeanDefinition
等方法isFactoryBean
ConfigurableListableBeanFactory
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory
集大成者,整合了所有接口的能力,并拓展了
getBeanDefinition
等方法
总结
-
,顶层接口,提供了最基础的方法譬如BeanFactory
getBean
containsBean
-
,子接口,拓展了HierarchicalBeanFactory
层级关系
-
,子接口,拓展了ListableBeanFactory
枚举能力
-
,子接口,拓展了AutowireCapableBeanFactory
能力自动装配
-
,子接口,拓展了相关组件ConfigurableBeanFactory
的能力可配置化
-
,集大成者,直接实现类ConfigurableListableBeanFactory
DefaultListableBeanFactory
下一章节:【源码】Spring —— BeanFactory 解读 2 AbstractBeanFactory