【源码】Spring —— BeanFactory 解读 3 AbstractAutowireCapableBeanFactory
- 前言
- 版本
- AbstractAutowireCapableBeanFactory
-
- createBean
- doCreateBean
- getEarlyBeanReference
- populateBean
- initializeBean
- 其他方法
- 总结
前言
上一章节解读了顶层抽象实现类
AbstractBeanFactory
,它主要实现了
BeanFactory
HierarchicalBeanFactory
ConfigurableBeanFactory
定义的大多数方法
其中,
BeanFactory#getBean
方法的实现最终是委托在抽象方法
createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] arg
的,
AbstractAutowireCapableBeanFactory
便提供了该方法的实现,本文会重点解读该方法
版本
Spring 5.3.x
AbstractAutowireCapableBeanFactory
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
implements AutowireCapableBeanFactory
AbstractAutowireCapableBeanFactory
是
AbstractBeanFactory
的子类,同时实现了
AutowireCapableBeanFactory
,之前提到
AutowireCapableBeanFactory
接口拓展了
自动装配
的能力,
AbstractAutowireCapableBeanFactory
便提供了相关实现
createBean
上文提到,
AbstractBeanFactory
实现
getBean
方法的逻辑最终是委托在抽象方法
createBean
的,
AbstractAutowireCapableBeanFactory
给出了该方法的实现
// 核心方法,创建bean实例、属性填充、后置处理等
@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
RootBeanDefinition mbdToUse = mbd;
// 解析类型(AbstractBeanFactory#resolveBeanClass)
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
// ...
}
try {
// 这个地方,允许 后置处理器 提前返回一个代理实例
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
// ...
}
try {
// 创建bean
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
return beanInstance;
}
catch (Throwable ex) {
// ...
}
}
@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
/**
* 如果 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
* 返回一个非空实例,则 生命周期 短路,直接执行所有后置处理器的
* postProcessAfterInitialization 方法
*/
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
代码如上,略去了打印日志等,做个概括:
- 在创建
前,有个重要方法bean实例
:此处会执行resolveBeforeInstantiation
,如果返回非InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
,则短路生命周期返回目标实例null
- 如果上述方法返回
(大多数场景),则由null
方法创建doCreateBean
bean实例
doCreateBean
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
BeanWrapper instanceWrapper = null;
// 如果是单例,从 工厂bean 缓存获取并清除缓存
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
// 如果为空,则创建对应的 BeanWrapper
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// 取出包装的实例进行后续处理
Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
// 执行所有的 MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
// ...
}
mbd.postProcessed = true;
}
}
/**
* 如果允许 循环依赖,此处会创建对应的 单例工厂
* 并将其缓存到 二级单例缓存(singletonFactories) 中
* getObject 方法委托给 getEarlyBeanReference 方法
*/
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
Object exposedObject = bean;
try {
// 属性填充
populateBean(beanName, mbd, instanceWrapper);
// 初始化操作:工厂回调、初始化回调、后处理
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
catch (Throwable ex) {
// ...
}
/**
* 对于循环依赖的 bean,此处尝试从三级缓存获取
*/
if (earlySingletonExposure) {
Object earlySingletonReference = getSingleton(beanName, false);
if (earlySingletonReference != null) {
if (exposedObject == bean) {
exposedObject = earlySingletonReference;
}
// ...
}
}
// ...
return exposedObject;
}
-
方法用于创建createBeanInstance
实例对象,该过程是我认为创建bean
过程中最最复杂的方法了 ,包括构造器的推断等诸多细节,此处不展开讨论bean
- 执行所有的
,MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
@Autowired
注解处理相关在此处有涉及@Value
- 对于需要处理
的实例,此处会借助循环依赖
进行处理工厂缓存
- 核心方法
:填充populateBean
的属性bean实例
-
方法进行initializeBean
的后续处理:初始化回调等bean实例
getEarlyBeanReference
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
Object exposedObject = bean;
/**
* 如果存在 InstantiationAwareBeanPostProcessor,则遍历执行
* getEarlyBeanReference,该过程可能返回一个 代理对象
*/
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);
}
}
return exposedObject;
}
doCreateBean
方法中创建了对应
bean实例对象
后,在允许
循环依赖
的情况下会缓存对应的
单例工厂
,该方法默认实现即
getEarlyBeanReference
:
- 这里如果存在
,便会依此执行InstantiationAwareBeanPostProcessor
方法,即此处是有可能返回getEarlyBeanReference
的代理对象
- 此处创建出来的实例之后会被加入
,以避免可能多次构造实例造成的性能损耗三级缓存
populateBean
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
// 空处理
if (bw == null) {
if (mbd.hasPropertyValues()) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
}
else {
return;
}
}
/**
* 此处是调用所有的 InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
* 但凡有返回 false,此处就 return 不继续注入了,目前的默认实现都是 true
*/
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
return;
}
}
}
// 从 BeanDefinition 获取 PropertyValues
PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
/**
* 解析注入模式
* AUTOWIRE_BY_NAME:根据名称注入
* AUTOWIRE_BY_TYPE:根据类型注入
* 一般情况 resolvedAutowireMode == AUTOWIRE_NO
*/
int resolvedAutowireMode = mbd.getResolvedAutowireMode();
if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
}
if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}
pvs = newPvs;
}
boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
PropertyDescriptor[] filteredPds = null;
/**
* 如果存在 InstantiationAwareBeanPostProcessor
* 则执行所有 InstantiationAwareBeanPostProcessor#postProcessProperties
* 辅助完成属性填充,诸如基于 @Autowired 等注解的属性注入就发生在此处
*/
if (hasInstAwareBpps) {
if (pvs == null) {
pvs = mbd.getPropertyValues();
}
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
if (pvsToUse == null) {
if (filteredPds == null) {
filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
}
pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
if (pvsToUse == null) {
return;
}
}
pvs = pvsToUse;
}
}
// 依赖校验
if (needsDepCheck) {
if (filteredPds == null) {
filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
}
checkDependencies(beanName, mbd, filteredPds, pvs);
}
// 属性绑定
if (pvs != null) {
applyPropertyValues(beanName, mbd, bw, pvs);
}
}
核心方法:属性填充,方法概括:
- 填充前会执行所有
,但凡有返回InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
的就不再继续,默认实现都是返回false
true
- 根据解析的
处理AutowireMode
和名称注入
两种情况,一般情况下注入模式是类型注入
,即不进行上述处理AUTOWIRE_NO
- 执行所有
来辅助完成顺序填充,其中的代表处理器有InstantiationAwareBeanPostProcessor#postProcessProperties
AutowiredAnnotationBeanPostProcessor
:基于CommonAnnotationBeanPostProcessor
@Autowired
等注解进行属性注入@Value
- 最后基于
和上述BeanWrapper
进行属性填充PropertyValues
initializeBean
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
/**
* invokeAwareMethods:
* 执行 BeanNameAware BeanClassLoaderAware BeanFactoryAware 回调
*/
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
invokeAwareMethods(beanName, bean);
}
/**
* 执行所有 BeanPostProcessor#postProcessBeforeInitialization:初始化前处理
*/
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
/**
* 初始化:
* 1)InitializingBean#afterPropertiesSet
* 2)init-method 回调
*/
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
}
/**
* 执行所有 BeanPostProcessor#postProcessAfterInitialization:初始化后处理
*/
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
此时的
bean实例
已构造完成并且填充好属性,
实例化
完成并进入
初始化
阶段:
- 初始化前处理:执行所有
方法BeanPostProcessor#postProcessBeforeInitialization
- 初始化操作主要是:1)执行所有实现了
接口的InitializingBean
方法 2)执行所有afterPropertiesSet
,比如init-method
注解上指定的、@Bean
注解标注的方法 等@PostConstruct
- 初始化后处理:执行所有
方法BeanPostProcessor#postProcessAfterInitialization
其他方法
AbstractAutowireCapableBeanFactory
实现了
AbstractBeanFactory
定义的抽象方法
createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
,它基于
容器
扫描的
BeanDefinition
提供了全生命周期
bean实例
的构造,包括
bean实例对象
的构造、各种后处理回调的执行、属性的填充、初始化操作 等
同时,作为
AutowireCapableBeanFactory
接口的实现,它对各生命周期的实现也是分离开的,并暴露出对应的方法供以调用,譬如:
@Override
@SuppressWarnings("unchecked")
public <T> T createBean(Class<T> beanClass) throws BeansException {
RootBeanDefinition bd = new RootBeanDefinition(beanClass);
// 默认原型
bd.setScope(SCOPE_PROTOTYPE);
bd.allowCaching = ClassUtils.isCacheSafe(beanClass, getBeanClassLoader());
return (T) createBean(beanClass.getName(), bd, null);
}
基于给定
Class
构造
RootBeanDefinition
,来创建
bean实例
@Override
public void autowireBean(Object existingBean) {
RootBeanDefinition bd = new RootBeanDefinition(ClassUtils.getUserClass(existingBean));
bd.setScope(SCOPE_PROTOTYPE);
bd.allowCaching = ClassUtils.isCacheSafe(bd.getBeanClass(), getBeanClassLoader());
BeanWrapper bw = new BeanWrapperImpl(existingBean);
initBeanWrapper(bw);
populateBean(bd.getBeanClass().getName(), bd, bw);
}
给定实例填充属性并执行初始化操作
等等
总结
- 作为
的子类,AbstractBeanFactory
实现了核心抽象方法AbstractAutowireCapableBeanFactory
,该方法用于构造一个执行全生命周期的createBean
bean实例
- 作为
的实现类,AutowireCapableBeanFactory
提供了AbstractAutowireCapableBeanFactory
的细粒度实现,比如熟悉的各阶段生命周期
方法等applyBeanPostProcessorsAfterInitialization
上一篇:【源码】Spring —— BeanFactory 解读 2 AbstractBeanFactory
下一篇:【源码】Spring —— BeanFactory 解读 4 关于循环依赖