同步操作将从 huifer/Code-Analysis 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
类全路径: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
类图
通过类图需要了解下面这些接口和类
AliasRegistry SimpleAliasRegistry DefaultSingletonBeanRegistry FactoryBeanRegistrySupport AbstractBeanFactory SingletonBeanRegistry ConfigurableBeanFactory HierarchicalBeanFactory BeanFactory AutowireCapableBeanFactory
在了解完前置内容后我们来阅读成员变量
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
implements AutowireCapableBeanFactory {
/**
* Dependency types to ignore on dependency check and autowire, as Set of Class objects: for
* example, String. Default is none.
*
* 忽略的依赖类型
*/
private final Set<Class<?>> ignoredDependencyTypes = new HashSet<>();
/**
* Dependency interfaces to ignore on dependency check and autowire, as Set of Class objects. By
* default, only the BeanFactory interface is ignored.
* 忽略的依赖接口
*/
private final Set<Class<?>> ignoredDependencyInterfaces = new HashSet<>();
/**
* The name of the currently created bean, for implicit dependency registration on getBean etc
* invocations triggered from a user-specified Supplier callback.
* 正在创建的 bean Name
*/
private final NamedThreadLocal<String> currentlyCreatedBean = new NamedThreadLocal<>("Currently created bean");
/**
* Cache of unfinished FactoryBean instances: FactoryBean name to BeanWrapper.
* key: beanName
* value: bean wrapper
*/
private final ConcurrentMap<String, BeanWrapper> factoryBeanInstanceCache = new ConcurrentHashMap<>();
/**
* Cache of candidate factory methods per factory class.
* 工厂方法缓存
* key: 工厂类
* value: 方法列表
*/
private final ConcurrentMap<Class<?>, Method[]> factoryMethodCandidateCache = new ConcurrentHashMap<>();
/**
* Cache of filtered PropertyDescriptors: bean Class to PropertyDescriptor array.
* key: 类
* value: 属性描述
*/
private final ConcurrentMap<Class<?>, PropertyDescriptor[]> filteredPropertyDescriptorsCache =
new ConcurrentHashMap<>();
/**
* Strategy for creating bean instances.
* 实例化策略
*/
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
/**
* Resolver strategy for method parameter names.
* 参数名称发现接口
*/
@Nullable
private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
/**
* Whether to automatically try to resolve circular references between beans.
* 是否允许循环引用
*/
private boolean allowCircularReferences = true;
/**
* Whether to resort to injecting a raw bean instance in case of circular reference, even if the
* injected bean eventually got wrapped.
* 原始注解
*/
private boolean allowRawInjectionDespiteWrapping = false;
}
在成员变量中有几个类和接口需要关注
在前面我们对类图、成员变量 做了一定的分析. 接下来就是对方法进行分析了
这里对 getter
和setter
忽略讲解.
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#copyConfigurationFrom
配置拷贝在这里简单的就是值赋值
@Override
public void copyConfigurationFrom(ConfigurableBeanFactory otherFactory) {
super.copyConfigurationFrom(otherFactory);
if (otherFactory instanceof AbstractAutowireCapableBeanFactory) {
AbstractAutowireCapableBeanFactory otherAutowireFactory =
(AbstractAutowireCapableBeanFactory) otherFactory;
this.instantiationStrategy = otherAutowireFactory.instantiationStrategy;
this.allowCircularReferences = otherAutowireFactory.allowCircularReferences;
this.ignoredDependencyTypes.addAll(otherAutowireFactory.ignoredDependencyTypes);
this.ignoredDependencyInterfaces.addAll(otherAutowireFactory.ignoredDependencyInterfaces);
}
}
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.Class<T>)
方法作用: 创建 bean
这将是一个及其重要的方法
本体代码相对来说比较容易.
@Override
@SuppressWarnings("unchecked")
public <T> T createBean(Class<T> beanClass) throws BeansException {
// Use prototype bean definition, to avoid registering bean as dependent bean.
RootBeanDefinition bd = new RootBeanDefinition(beanClass);
bd.setScope(SCOPE_PROTOTYPE);
// 确认是否需要缓存
bd.allowCaching = ClassUtils.isCacheSafe(beanClass, getBeanClassLoader());
// 创建 bean
return (T) createBean(beanClass.getName(), bd, null);
}
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
方法首先了解这个方法的参数
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {}
接下来一部分一部分开始分析
第一部分代码主要准备对象RootBeanDefinition
具体有下面两种处理方式
// beanDefinition
RootBeanDefinition mbdToUse = mbd;
// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class
// which cannot be stored in the shared merged bean definition.
// 获取当前需要加载的类
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
// 1. 待处理的类不为空
// 2. bean定义中含有 beanClass
// 3. className 不为空
// 满足、上述三点的情况下会去创建 RootBeanDefinition
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
// 创建 beanDefinition
mbdToUse = new RootBeanDefinition(mbd);
// 设置bean class
mbdToUse.setBeanClass(resolvedClass);
}
关于 resolveBeanClass
的分析请查看这篇文章
继续看第二部分代码,第二部分代码是关于方法重写的处理,即org.springframework.beans.factory.support.AbstractBeanDefinition#prepareMethodOverrides
方法调用
try {
// 方法重写
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex
);
}
关于prepareMethodOverrides
的分析请查看这篇文章
继续看第三部分代码,第三部分代码是关于bean实例化之前的操作.
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
// 创建bean之前的行为
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex
);
}
第三部分的代码主要都由resolveBeforeInstantiation
来进行. 下面对这个方法进行分析
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
// 是否需要在 bean 初始化之前做一些关于 beanPostProcessor 相关的行为
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
// 是否是合成bean
// 是否拥有 BeanPostProcessor 接口
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
// 目标类型确认
Class<?> targetType = determineTargetType(beanName, mbd);
// 前置方法 BeanPostProcessor 接口的调用
if (targetType != null) {
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
// 后置方法
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
在代码前半部分有一些条件判断
bean 是否需要做 BeanPostProcessor
的行为,即调用接口BeanPostProcessor
判断是否是合成 bean , 合成bean 在Spring中有 mergedBean 形式的方法如
getMergedLocalBeanDefinition
、getMergedBeanDefinition
等. 这里不做展开
是否存在BeanPostProcessor
接口
在条件验证通过后会有 目标类型的推断 和 BeanPostProcessor
接口的调度
先来看determineTargetType
方法
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineTargetType
方法作用: 确定目标类型
@Nullable
protected Class<?> determineTargetType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
// beanDefinition 中的类型
Class<?> targetType = mbd.getTargetType();
// 不存在的情况下处理方式
if (targetType == null) {
targetType = (mbd.getFactoryMethodName() != null ?
getTypeForFactoryMethod(beanName, mbd, typesToMatch) :
resolveBeanClass(mbd, beanName, typesToMatch));
if (ObjectUtils.isEmpty(typesToMatch) || getTempClassLoader() == null) {
mbd.resolvedTargetType = targetType;
}
}
return targetType;
}
这里方法主要关注 从 BeanDefinition 中获取不到的情况 两种获取方式
getTypeForFactoryMethod
resolveBeanClass
两个方法的调用依据是判断 工厂函数名称 是否存在,即 **FactoryMethod
**是否存在
resolveBeanClass
分析查看: 这篇文章
resolveBeanClass
在之前分析过了. 下面主要对getTypeForFactoryMethod
进行分析
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getTypeForFactoryMethod
// 获取 工厂方法的回调类型解析器
ResolvableType cachedReturnType = mbd.factoryMethodReturnType;
if (cachedReturnType != null) {
// 类型解析器中获取类型
return cachedReturnType.resolve();
}
// 公共父类
Class<?> commonType = null;
// 工厂方法
Method uniqueCandidate = mbd.factoryMethodToIntrospect;
第一部分代码获取基本操作对象, 在这里有一个可以直接返回的可能
BeanDefinition
中的factoryMethodReturnType
属性不为空直接解析返回
接下来阅读 if
中的内容
Class<?> factoryClass;
boolean isStatic = true;
// 工厂bean名称
String factoryBeanName = mbd.getFactoryBeanName();
if (factoryBeanName != null) {
// 工厂 bean 名称和 参数 bean名称是否相同
if (factoryBeanName.equals(beanName)) {
throw new BeanDefinitionStoreException(mbd.getResourceDescription(), beanName,
"factory-bean reference points back to the same bean definition"
);
}
// Check declared factory method return type on factory class.
// 获取 工厂bean的类型
factoryClass = getType(factoryBeanName);
isStatic = false;
}
else {
// Check declared factory method return type on bean class.
// 解析 bean 类型
factoryClass = resolveBeanClass(mbd, beanName, typesToMatch);
}
if (factoryClass == null) {
return null;
}
factoryClass = ClassUtils.getUserClass(factoryClass);
// If all factory methods have the same return type, return that type.
// Can't clearly figure out exact method due to type converting / autowiring!
int minNrOfArgs =
(mbd.hasConstructorArgumentValues() ? mbd.getConstructorArgumentValues().getArgumentCount() : 0);
// 候选函数列表
Method[] candidates = this.factoryMethodCandidateCache.computeIfAbsent(
factoryClass,
clazz -> ReflectionUtils.getUniqueDeclaredMethods(clazz, ReflectionUtils.USER_DECLARED_METHODS)
);
这部分代码依赖 getType
来获取工厂类型 和 resolveBeanClass
方法解析bean类型 最终得到 factoryClass
变量. 但这里并不是直义 工厂类型
在这之后会处理factoryMethodCandidateCache
对象的内容.
key: class
value: method[]
在这里得到对象 candidates
在循环中进行数据处理
for (Method candidate : candidates) {
// 过滤条件
if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate) &&
candidate.getParameterCount() >= minNrOfArgs) {
// Declared type variables to inspect?
if (candidate.getTypeParameters().length > 0) {
try {
// Fully resolve parameter names and argument values.
// 函数的参数类型
Class<?>[] paramTypes = candidate.getParameterTypes();
String[] paramNames = null;
// 获取 参数名称发现器
ParameterNameDiscoverer pnd = getParameterNameDiscoverer();
if (pnd != null) {
// 解析参数名称
paramNames = pnd.getParameterNames(candidate);
}
// 构造函数参数对象
ConstructorArgumentValues cav = mbd.getConstructorArgumentValues();
// 获取 ConstructorArgumentValues 中的 ValueHolder
Set<ConstructorArgumentValues.ValueHolder> usedValueHolders = new HashSet<>(paramTypes.length);
// 参数对象
Object[] args = new Object[paramTypes.length];
// 循环中处理两个集合
// 1. usedValueHolders 放入 ValueHolder
// 2. args 放入 ValueHolder 中存储的值
for (int i = 0; i < args.length; i++) {
ConstructorArgumentValues.ValueHolder valueHolder = cav.getArgumentValue(
i, paramTypes[i], (paramNames != null ? paramNames[i] : null), usedValueHolders);
if (valueHolder == null) {
valueHolder = cav.getGenericArgumentValue(null, null, usedValueHolders);
}
if (valueHolder != null) {
args[i] = valueHolder.getValue();
usedValueHolders.add(valueHolder);
}
}
// 获取返回值
Class<?> returnType = AutowireUtils.resolveReturnTypeForFactoryMethod(
candidate, args, getBeanClassLoader());
uniqueCandidate = (commonType == null && returnType == candidate.getReturnType() ?
candidate : null);
// 公共父类获取
commonType = ClassUtils.determineCommonAncestor(returnType, commonType);
if (commonType == null) {
// Ambiguous return types found: return null to indicate "not determinable".
return null;
}
}
catch (Throwable ex) {
if (logger.isDebugEnabled()) {
logger.debug("Failed to resolve generic return type for factory method: " + ex);
}
}
}
else {
uniqueCandidate = (commonType == null ? candidate : null);
// 公共父类获取
commonType = ClassUtils.determineCommonAncestor(candidate.getReturnType(), commonType);
if (commonType == null) {
// Ambiguous return types found: return null to indicate "not determinable".
return null;
}
}
}
}
循环处理的代码没有什么特别的地方. 重点是理解几个变量
最后一段
// Common return type found: all factory methods return same type. For a non-parameterized
// unique candidate, cache the full type declaration context of the target factory method.
// 获取 return 值
cachedReturnType = (uniqueCandidate != null ?
ResolvableType.forMethodReturnType(uniqueCandidate) : ResolvableType.forClass(commonType));
mbd.factoryMethodReturnType = cachedReturnType;
return cachedReturnType.resolve();
最后一段是处理 return
结果的 (求工厂函数的返回值类型)
这里有两种方式
ResolvableType.forMethodReturnType
ResolvableType.forClass
两种方式最终为了得到ResolvableType
对象, 依赖ResolvableType#resolve
方法解析到类型
整体流程讲述完成. 接下来看看下面的代码
@Nullable
protected Class<?> getTypeForFactoryMethod(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
// 获取 工厂方法的回调类型解析器
ResolvableType cachedReturnType = mbd.factoryMethodReturnType;
if (cachedReturnType != null) {
// 类型解析器中获取类型
return cachedReturnType.resolve();
}
// 公共父类
Class<?> commonType = null;
// 工厂方法
Method uniqueCandidate = mbd.factoryMethodToIntrospect;
if (uniqueCandidate == null) {
Class<?> factoryClass;
boolean isStatic = true;
// 工厂bean名称
String factoryBeanName = mbd.getFactoryBeanName();
if (factoryBeanName != null) {
// 工厂 bean 名称和 参数 bean名称是否相同
if (factoryBeanName.equals(beanName)) {
throw new BeanDefinitionStoreException(mbd.getResourceDescription(), beanName,
"factory-bean reference points back to the same bean definition"
);
}
// Check declared factory method return type on factory class.
// 获取 工厂bean的类型
factoryClass = getType(factoryBeanName);
isStatic = false;
}
else {
// Check declared factory method return type on bean class.
// 解析 bean 类型
factoryClass = resolveBeanClass(mbd, beanName, typesToMatch);
}
if (factoryClass == null) {
return null;
}
factoryClass = ClassUtils.getUserClass(factoryClass);
// If all factory methods have the same return type, return that type.
// Can't clearly figure out exact method due to type converting / autowiring!
int minNrOfArgs =
(mbd.hasConstructorArgumentValues() ? mbd.getConstructorArgumentValues().getArgumentCount() : 0);
// 候选函数列表
Method[] candidates = this.factoryMethodCandidateCache.computeIfAbsent(
factoryClass,
clazz -> ReflectionUtils.getUniqueDeclaredMethods(clazz, ReflectionUtils.USER_DECLARED_METHODS)
);
for (Method candidate : candidates) {
// 过滤条件
if (Modifier.isStatic(candidate.getModifiers()) == isStatic && mbd.isFactoryMethod(candidate) &&
candidate.getParameterCount() >= minNrOfArgs) {
// Declared type variables to inspect?
if (candidate.getTypeParameters().length > 0) {
try {
// Fully resolve parameter names and argument values.
// 函数的参数类型
Class<?>[] paramTypes = candidate.getParameterTypes();
String[] paramNames = null;
// 获取 参数名称发现器
ParameterNameDiscoverer pnd = getParameterNameDiscoverer();
if (pnd != null) {
// 解析参数名称
paramNames = pnd.getParameterNames(candidate);
}
// 构造函数参数对象
ConstructorArgumentValues cav = mbd.getConstructorArgumentValues();
// 获取 ConstructorArgumentValues 中的 ValueHolder
Set<ConstructorArgumentValues.ValueHolder> usedValueHolders = new HashSet<>(paramTypes.length);
// 参数对象
Object[] args = new Object[paramTypes.length];
// 循环中处理两个集合
// 1. usedValueHolders 放入 ValueHolder
// 2. args 放入 ValueHolder 中存储的值
for (int i = 0; i < args.length; i++) {
ConstructorArgumentValues.ValueHolder valueHolder = cav.getArgumentValue(
i, paramTypes[i], (paramNames != null ? paramNames[i] : null), usedValueHolders);
if (valueHolder == null) {
valueHolder = cav.getGenericArgumentValue(null, null, usedValueHolders);
}
if (valueHolder != null) {
args[i] = valueHolder.getValue();
usedValueHolders.add(valueHolder);
}
}
// 获取返回值
Class<?> returnType = AutowireUtils.resolveReturnTypeForFactoryMethod(
candidate, args, getBeanClassLoader());
uniqueCandidate = (commonType == null && returnType == candidate.getReturnType() ?
candidate : null);
// 公共父类获取
commonType = ClassUtils.determineCommonAncestor(returnType, commonType);
if (commonType == null) {
// Ambiguous return types found: return null to indicate "not determinable".
return null;
}
}
catch (Throwable ex) {
if (logger.isDebugEnabled()) {
logger.debug("Failed to resolve generic return type for factory method: " + ex);
}
}
}
else {
uniqueCandidate = (commonType == null ? candidate : null);
// 公共父类获取
commonType = ClassUtils.determineCommonAncestor(candidate.getReturnType(), commonType);
if (commonType == null) {
// Ambiguous return types found: return null to indicate "not determinable".
return null;
}
}
}
}
mbd.factoryMethodToIntrospect = uniqueCandidate;
if (commonType == null) {
return null;
}
}
// Common return type found: all factory methods return same type. For a non-parameterized
// unique candidate, cache the full type declaration context of the target factory method.
// 获取 return 值
cachedReturnType = (uniqueCandidate != null ?
ResolvableType.forMethodReturnType(uniqueCandidate) : ResolvableType.forClass(commonType));
mbd.factoryMethodReturnType = cachedReturnType;
return cachedReturnType.resolve();
}
到这里我们将determineTargetType
分析完成, 回到org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
中
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
// 目标类型确认
Class<?> targetType = determineTargetType(beanName, mbd);
// 前置方法 BeanPostProcessor 接口的调用
if (targetType != null) {
// postProcessBeforeInstantiation 执行
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
// 后置方法
// postProcessAfterInitialization 执行
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
在resolveBeforeInstantiation
代码中 后续有两个方法调用
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
方法作用: 执行容器中BeanPostProcessor
接口的postProcessBeforeInstantiation
方法
@Nullable
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
// 调用自定义实现
Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
return result;
}
}
}
return null;
}
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
BeanPostProcessor
接口的postProcessAfterInitialization
方法@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
// 执行 spring 容器中 BeanPostProcessor
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
在这两个方法执行后就结束了resolveBeforeInstantiation
的调用了. 接下来回到createBean
createBean
第四部分代码
try {
// 创建bean
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isTraceEnabled()) {
logger.trace("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
// A previously detected exception with proper bean creation context already,
// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(
mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
}
第四部分代码就是 doCreateBean
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
在分析源码之前我们先想一想对象创建的过程
spring 在doCreateBean
中的操作也基本类似, 在这个基础上还有一些其他操作. 下面就开始分析
final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args
beanName
: bean名称mbd
: bean 定义args
参数列表// Instantiate the bean.
BeanWrapper instanceWrapper = null;
// 是否单例
if (mbd.isSingleton()) {
// beanFactory 移除当前创建的beanName
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
// beanWrapper 是否存在
if (instanceWrapper == null) {
// 创建 bean 实例
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
流程
判断 bean 是否是单例的
是
从factoryBeanInstanceCache
中获取BeanWrapper
, factoryBeanInstanceCache
信息如下
private final ConcurrentMap<String, BeanWrapper> factoryBeanInstanceCache = new ConcurrentHashMap<>();
instanceWrapper
非空判断 在这里会有一个方法createBeanInstance
的调用
if (instanceWrapper == null) {
// 创建 bean 实例
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
下面就是对createBeanInstance
方法的进一步分析了.
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
beanWrapper
先来看代码第一部分
// Make sure bean class is actually resolved at this point.
// 第一部分
// 获取 bean class
Class<?> beanClass = resolveBeanClass(mbd, beanName);
// bean 是否可以被创建的验证
if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Bean class isn't public, and non-public access not allowed: " + beanClass.getName()
);
}
在第一部代码中首先对 bean class 做了一个判断. 判断它是否可以被创建, 如果不能不创建会抛出异常
继续阅读第二部分代码.
// 第二部分
// 返回一个用来创建bean实例的回调接口
// Supplier get 直接获取bean对象
Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
if (instanceSupplier != null) {
return obtainFromSupplier(instanceSupplier, beanName);
}
第二部分代码所作的行为和Supplier
有所关联. 其真正的操作方法在obtainFromSupplier
中, 接下来对其进行分析
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#obtainFromSupplier
Supplier
接口中获取对象,创建成 beanWrapper
protected BeanWrapper obtainFromSupplier(Supplier<?> instanceSupplier, String beanName) {
Object instance;
// 获取当前的beanName
String outerBean = this.currentlyCreatedBean.get();
// 设置当前处理的beanName
this.currentlyCreatedBean.set(beanName);
try {
// 从 Supplier 中获取
instance = instanceSupplier.get();
}
finally {
if (outerBean != null) {
// 如果 currentlyCreatedBean 取不到设置
this.currentlyCreatedBean.set(outerBean);
}
else {
// 移除
this.currentlyCreatedBean.remove();
}
}
if (instance == null) {
// supplier 中获取不到, 将实例设置为 NullBean
instance = new NullBean();
}
// beanWrapper 包装
BeanWrapper bw = new BeanWrapperImpl(instance);
// beanWrapper 实例化后的操作
initBeanWrapper(bw);
return bw;
}
方法中涉及到变量currentlyCreatedBean
: 正在创建的 beanName
/**
* The name of the currently created bean, for implicit dependency registration on getBean etc
* invocations triggered from a user-specified Supplier callback.
* 正在创建的 bean Name
*/
private final NamedThreadLocal<String> currentlyCreatedBean = new NamedThreadLocal<>("Currently created bean");
方法最后返回的时候还有一个类的初始化(BeanWrapper
)和一个方法的调用(initBeanWrapper
)详细分析请查看下面两个文档
createBeanInstance
的第二部分代码也分析完成. 继续阅读第三部分的代码.
// 第三部分
if (mbd.getFactoryMethodName() != null) {
// 通过工厂方法创建
return instantiateUsingFactoryMethod(beanName, mbd, args);
}
第三部分代码涉及到 FactoryMethod 的创建 ,调用方法为: instantiateUsingFactoryMethod
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#instantiateUsingFactoryMethod
方法作用: 依赖ConstructorResolver
类来创建 BeanWrapper
protected BeanWrapper instantiateUsingFactoryMethod(
String beanName, RootBeanDefinition mbd, @Nullable Object[] explicitArgs) {
// 调用 factory-method 方法
return new ConstructorResolver(this).instantiateUsingFactoryMethod(beanName, mbd, explicitArgs);
}
这里需要将目光转移到 ConstructorResolver
类上面, 对ConstructorResolver
的分析请查看这篇文章
继续阅读第四部分代码.
// 第四部分
// Shortcut when re-creating the same bean...
// 是否已经处理完成的标记
boolean resolved = false;
// 是否需要啊自动注入的标记
boolean autowireNecessary = false;
if (args == null) {
synchronized (mbd.constructorArgumentLock) {
if (mbd.resolvedConstructorOrFactoryMethod != null) {
resolved = true;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
第四部分的代码操作主要为了两个变量的设置
resolved
: 是否已经处理完成的标记
autowireNecessary
: 是否需要啊自动注入的标记
继续阅读第五部分代码
// 第五部分
if (resolved) {
if (autowireNecessary) {
// 自动构造 bean
return autowireConstructor(beanName, mbd, null, null);
}
else {
// 实例化bean
return instantiateBean(beanName, mbd);
}
}
第五部分代码围绕第四部分的两个变量值进行两种 bean 的构造处理
autowireConstructor
instantiateBean
下面就开始这两个方法进行分析
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#autowireConstructor
方法作用: 自动装配 Bean 后返回结果
protected BeanWrapper autowireConstructor(
String beanName, RootBeanDefinition mbd, @Nullable Constructor<?>[] ctors, @Nullable Object[] explicitArgs) {
return new ConstructorResolver(this).autowireConstructor(beanName, mbd, ctors, explicitArgs);
}
在autowireConstructor
方法中涉及到ConstructorResolver
类详细分析请查看这篇文章
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#instantiateBean
protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
try {
Object beanInstance;
final BeanFactory parent = this;
if (System.getSecurityManager() != null) {
// 获取实例化策略来进行实例化
beanInstance = AccessController.doPrivileged(
(PrivilegedAction<Object>) () ->
getInstantiationStrategy().instantiate(mbd, beanName, parent),
getAccessControlContext()
);
}
else {
// 获取实例化策略来进行实例化
beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
}
// beanWrapper 创建
BeanWrapper bw = new BeanWrapperImpl(beanInstance);
initBeanWrapper(bw);
return bw;
}
catch (Throwable ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
}
}
从代码上可以看出这里依靠getInstantiationStrategy().instantiate(mbd, beanName, parent)
代码在做主要操作. 这里就是一个InstantiationStrategy
的调用 , 详细分析请查看InstantiationStrategy分析文章
createBeanInstance
的第六部分代码// 第六部分
// Candidate constructors for autowiring?
// 确定构造函数列表
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
// 自动装配处理
return autowireConstructor(beanName, mbd, ctors, args);
}
// Preferred constructors for default construction?
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
// 自动装配处理
return autowireConstructor(beanName, mbd, ctors, null);
}
// No special handling: simply use no-arg constructor.
// 实例化 bean
return instantiateBean(beanName, mbd);
第六部分处理了下面这些行为
determineConstructorsFromBeanPostProcessors
autowireConstructor
instantiateBean
在处理行为中determineConstructorsFromBeanPostProcessors
是我们还没有看到过的方法, 展开分析一下
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
Constructor
列表/**
* Determine candidate constructors to use for the given bean, checking all registered {@link
* SmartInstantiationAwareBeanPostProcessor SmartInstantiationAwareBeanPostProcessors}.
*
* 通过 BeanPostProcessor 的子接口 SmartInstantiationAwareBeanPostProcessor 来获取 Constructor 列表
* @param beanClass the raw class of the bean
* @param beanName the name of the bean
*
* @return the candidate constructors, or {@code null} if none specified
*
* @throws org.springframework.beans.BeansException in case of errors
* @see org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
*/
@Nullable
protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName)
throws BeansException {
if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
// SmartInstantiationAwareBeanPostProcessor 的实现类中获取
Constructor<?>[] ctors = ibp.determineCandidateConstructors(beanClass, beanName);
if (ctors != null) {
return ctors;
}
}
}
}
return null;
}
在determineConstructorsFromBeanPostProcessors
方法中主要依赖BeanPostProcessor
的子接口SmartInstantiationAwareBeanPostProcessor
的determineCandidateConstructors
方法来获取.
关于SmartInstantiationAwareBeanPostProcessor
的分析查看这篇文章
到这里 createBeanInstance
方法的分析就完成了.
在createBeanInstance
分析后我们对doCreateBean
的第一部分代码分析也就完成了.
下面继续阅读第二部分的代码
// 第二部分
// 获取 实例
final Object bean = instanceWrapper.getWrappedInstance();
// beanWrapper中存储的实例.class
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
// Allow post-processors to modify the merged bean definition.
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
// 后置方法执行 BeanPostProcessor
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of merged bean definition failed", ex
);
}
mbd.postProcessed = true;
}
}
第二部分处理了一些值的设置, 以及一个方法applyMergedBeanDefinitionPostProcessors
的调用
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
方法作用: 执行MergedBeanDefinitionPostProcessor
j接口的postProcessMergedBeanDefinition
方法
有关MergedBeanDefinitionPostProcessor
的分析请查看这篇文章
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof MergedBeanDefinitionPostProcessor) {
MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
}
}
}
继续向下阅读doCreateBean
方法的 第三部分
// 是否需要提前暴露
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
// 单例对象暴露
if (earlySingletonExposure) {
if (logger.isTraceEnabled()) {
logger.trace("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
// 添加单例工厂
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
第三部分代码涉及到一个提前暴露的一个概念, 这里通过下面这段代码来判断是否是提前暴露的
(mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName))
mbd.isSingleton()
this.allowCircularReferences
isSingletonCurrentlyInCreation(beanName)
再通过上面三个条件后会降入到单例工厂中. 这里就涉及到循环依赖的处理了. (和第四部分代码存在关联)
继续阅读doCreateBean
的第四部分代码
// 第四部分
// 实例化bean
// Initialize the bean instance.
Object exposedObject = bean;
try {
// 设置属性
populateBean(beanName, mbd, instanceWrapper);
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
catch (Throwable ex) {
if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
throw (BeanCreationException) ex;
}
else {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
}
}
第四部分代码两个方法
populateBean
: 设置属性
initializeBean
: 实例化bean
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
首先阅读第一部分代码
// 第一部分
if (bw == null) {
if (mbd.hasPropertyValues()) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
}
else {
// Skip property population phase for null instance.
return;
}
}
第一部分主要做数据的验证
org.springframework.beans.MutablePropertyValues
: 分析文章)继续阅读第二部分代码
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
return;
}
}
}
}
第二部分主要做InstantiationAwareBeanPostProcessor
接口调用.
继续阅读第三部分代码
// 第三部分
PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
// 获取自动注入的值(自动注入的类型)
int resolvedAutowireMode = mbd.getResolvedAutowireMode();
// 自动注入
if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
// Add property values based on autowire by name if applicable.
if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
// 按照名称注入
autowireByName(beanName, mbd, bw, newPvs);
}
// Add property values based on autowire by type if applicable.
if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
// 按照类型注入
autowireByType(beanName, mbd, bw, newPvs);
}
pvs = newPvs;
}
关注一个接口, 2个方法
PropertyValues
: 分析文章
autowireByName
: 按照名称注入autowireByType
:按照类型注入下面对2、3两个方法进行分析
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#autowireByName
方法作用: 根据名称注入属性
protected void autowireByName(
String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
// 获取属性名称列表 (非普通类型)
String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
// 循环赋值
for (String propertyName : propertyNames) {
// 属性是否是 bean
if (containsBean(propertyName)) {
// 获取 bean
Object bean = getBean(propertyName);
pvs.add(propertyName, bean);
// 注册依赖
registerDependentBean(propertyName, beanName);
if (logger.isTraceEnabled()) {
logger.trace("Added autowiring by name from bean name '" + beanName +
"' via property '" + propertyName + "' to bean named '" + propertyName + "'");
}
}
else {
if (logger.isTraceEnabled()) {
logger.trace("Not autowiring property '" + propertyName + "' of bean '" + beanName +
"' by name: no matching bean found");
}
}
}
}
在方法中涉及下面三个方法
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#unsatisfiedNonSimpleProperties
方法作用: 获取属性名称列表 (非普通类型)
protected String[] unsatisfiedNonSimpleProperties(AbstractBeanDefinition mbd, BeanWrapper bw) {
Set<String> result = new TreeSet<>();
// 获取 PropertyValues
PropertyValues pvs = mbd.getPropertyValues();
// 获取 属性描述符对象列表
PropertyDescriptor[] pds = bw.getPropertyDescriptors();
// 循环属性描述符 , 通过条件判断来确定是否是一个不简单的属性
for (PropertyDescriptor pd : pds) {
// 1. 可写函数是否存在
// 2. 是否是依赖检查中排除的
// 3. pvc 中是否包含
// 4. 是否是一个简单类型
if (pd.getWriteMethod() != null && !isExcludedFromDependencyCheck(pd) && !pvs.contains(pd.getName()) &&
!BeanUtils.isSimpleProperty(pd.getPropertyType())) {
result.add(pd.getName());
}
}
return StringUtils.toStringArray(result);
}
unsatisfiedNonSimpleProperties
方法中关注一个条件语句
pd.getWriteMethod() != null && !isExcludedFromDependencyCheck(pd) && !pvs.contains(pd.getName()) &&
!BeanUtils.isSimpleProperty(pd.getPropertyType())
这几个条件的含义如下
pd.getWriteMethod()
!isExcludedFromDependencyCheck(pd)
!pvs.contains(pd.getName())
!BeanUtils.isSimpleProperty(pd.getPropertyType())
这里的疑问点: 简单类型是指什么,这个问题可以查看下面的代码得到答案
public static boolean isSimpleValueType(Class<?> type) {
return (Void.class != type && void.class != type &&
(ClassUtils.isPrimitiveOrWrapper(type) ||
Enum.class.isAssignableFrom(type) ||
CharSequence.class.isAssignableFrom(type) ||
Number.class.isAssignableFrom(type) ||
Date.class.isAssignableFrom(type) ||
Temporal.class.isAssignableFrom(type) ||
URI.class == type ||
URL.class == type ||
Locale.class == type ||
Class.class == type));
}
在unsatisfiedNonSimpleProperties
方法执行后获取到的 属性名称会被赋值
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#autowireByType
方法作用: 更具类型注入属性
protected void autowireByType(
String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
// 类型转换器
TypeConverter converter = getCustomTypeConverter();
if (converter == null) {
converter = bw;
}
// 需要注入的 beanName
Set<String> autowiredBeanNames = new LinkedHashSet<>(4);
// 获取属性名称列表 (非普通类型)
String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
// 循环处理 属性名称的bean
for (String propertyName : propertyNames) {
try {
// 获取属性描述符
PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);
// Don't try autowiring by type for type Object: never makes sense,
// even if it technically is a unsatisfied, non-simple property.
// 类型判断 不会给 Object 类型的数据做处理
if (Object.class != pd.getPropertyType()) {
// 函数参数
MethodParameter methodParam = BeanUtils.getWriteMethodParameter(pd);
// Do not allow eager init for type matching in case of a prioritized post-processor.
// 类型是否是 PriorityOrdered
boolean eager = !(bw.getWrappedInstance() instanceof PriorityOrdered);
// 依赖描述对象
DependencyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);
// 获得依赖对象
// 实现在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency
Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter);
if (autowiredArgument != null) {
// 设置值
pvs.add(propertyName, autowiredArgument);
}
// 依赖注册到容器
for (String autowiredBeanName : autowiredBeanNames) {
registerDependentBean(autowiredBeanName, beanName);
if (logger.isTraceEnabled()) {
logger.trace("Autowiring by type from bean name '" + beanName + "' via property '" +
propertyName + "' to bean named '" + autowiredBeanName + "'");
}
}
// 清理对象
autowiredBeanNames.clear();
}
}
catch (BeansException ex) {
throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);
}
}
}
主线流程如下
resolveDependency
这个的真实实现在org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency
,分析文章
到这里两种注入方式都讲述完成. 下面进行实例化bean的分析
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
方法作用: 实例化bean
首先阅读initializeBean
的第一部分代码
// 第一部分
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
// aware 接口执行
invokeAwareMethods(beanName, bean);
}
在第一部分代码中核心方法是invokeAwareMethods
这里方法主要执行Aware
接口的相关方法
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
private void invokeAwareMethods(final String beanName, final Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
看完invokeAwareMethods
后回到initializeBean
方法进行第二部分的阅读
// 第二部分
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
// BeanPostProcessor 前置方法执行
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
第二部分代码主要围绕applyBeanPostProcessorsBeforeInitialization
的调用
关于applyBeanPostProcessorsBeforeInitialization
的分析向下阅读
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
BeanPostProcessor
的postProcessBeforeInitialization
方法@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessBeforeInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
继续向下阅读initializeBean
的第三部分代码
// 第三部分
try {
// 执行实例化函数
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex
);
}
第三部分代码核心是调用invokeInitMethods
方法, 在这里着重讲述其过程
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods
在invokeInitMethods
分为两种init
方法
init-method
属性@Bean
注解的属性initMethod -> org.springframework.context.annotation.Bean#initMethod
InitializingBean
接口的afterPropertiesSet
方法在这个基础上我们进行源码分析
// 第一部分
// 是否是 InitializingBean
boolean isInitializingBean = (bean instanceof InitializingBean);
// 是否存在方法 "afterPropertiesSet"
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isTraceEnabled()) {
logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
// 执行 afterPropertiesSet
AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
((InitializingBean) bean).afterPropertiesSet();
return null;
}, getAccessControlContext());
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
// 执行 afterPropertiesSet
((InitializingBean) bean).afterPropertiesSet();
}
}
spring 在invokeInitMethods
方法中第一部分的处理是针对InitializingBean
接口的处理
处理方式就是类型转换+方法调用
下面阅读第二部分代码
// 第二部分
if (mbd != null && bean.getClass() != NullBean.class) {
// 获取 initMethod 字符串
String initMethodName = mbd.getInitMethodName();
if (StringUtils.hasLength(initMethodName) &&
!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
// 自定义的 init method
invokeCustomInitMethod(beanName, bean, mbd);
}
}
第二部分的核心操作逻辑
initMethod
字符串上述步骤1 对应 -> String initMethodName = mbd.getInitMethodName();
上述步骤 2、3 对应 -> invokeCustomInitMethod(beanName, bean, mbd);
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeCustomInitMethod
initMethod
整个放方法的逻辑就和前文说的一样
initMethod
字符串对应着看下面代码各位就可以看明白了
protected void invokeCustomInitMethod(String beanName, final Object bean, RootBeanDefinition mbd)
throws Throwable {
// 获取 initMethod 名称
String initMethodName = mbd.getInitMethodName();
Assert.state(initMethodName != null, "No init method set");
// 反射获取方法
Method initMethod = (mbd.isNonPublicAccessAllowed() ?
BeanUtils.findMethod(bean.getClass(), initMethodName) :
ClassUtils.getMethodIfAvailable(bean.getClass(), initMethodName));
// 方法是否存在判断
if (initMethod == null) {
if (mbd.isEnforceInitMethod()) {
throw new BeanDefinitionValidationException("Could not find an init method named '" +
initMethodName + "' on bean with name '" + beanName + "'");
}
else {
if (logger.isTraceEnabled()) {
logger.trace("No default init method named '" + initMethodName +
"' found on bean with name '" + beanName + "'");
}
// Ignore non-existent default lifecycle methods.
return;
}
}
if (logger.isTraceEnabled()) {
logger.trace("Invoking init method '" + initMethodName + "' on bean with name '" + beanName + "'");
}
// 尝试获取接口方法
Method methodToInvoke = ClassUtils.getInterfaceMethodIfPossible(initMethod);
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
ReflectionUtils.makeAccessible(methodToInvoke);
return null;
});
try {
// 反射调用
AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () ->
methodToInvoke.invoke(bean), getAccessControlContext());
}
catch (PrivilegedActionException pae) {
InvocationTargetException ex = (InvocationTargetException) pae.getException();
throw ex.getTargetException();
}
}
else {
try {
// 反射调用
// setAccessible true
ReflectionUtils.makeAccessible(methodToInvoke);
methodToInvoke.invoke(bean);
}
catch (InvocationTargetException ex) {
throw ex.getTargetException();
}
}
}
前面分步骤分析好了下面就请各位阅读一个完整的方法
protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
throws Throwable {
// 第一部分
// 是否是 InitializingBean
boolean isInitializingBean = (bean instanceof InitializingBean);
// 是否存在方法 "afterPropertiesSet"
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isTraceEnabled()) {
logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
// 执行 afterPropertiesSet
AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
((InitializingBean) bean).afterPropertiesSet();
return null;
}, getAccessControlContext());
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
// 执行 afterPropertiesSet
((InitializingBean) bean).afterPropertiesSet();
}
}
// 第二部分
if (mbd != null && bean.getClass() != NullBean.class) {
String initMethodName = mbd.getInitMethodName();
if (StringUtils.hasLength(initMethodName) &&
!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
// 自定义的 init method
invokeCustomInitMethod(beanName, bean, mbd);
}
}
}
到这里invokeInitMethods
方法的分析就结束了. 回到我们的initializeBean
方法. 前面我们对第三部分代码进行了一个分析
// 第三部分
try {
// 执行实例化函数
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex
);
}
接下来我们对第四部分进行分析
// 第四部分
if (mbd == null || !mbd.isSynthetic()) {
// BeanPostProcessor 后置方法执行
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
第四部分主要围绕applyBeanPostProcessorsAfterInitialization
方法
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
方法作用: 执行 spring 容器中 BeanPostProcessor
@Override
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
// 执行 spring 容器中 BeanPostProcessor
Object current = processor.postProcessAfterInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}
下面继续阅读doCreateBean
的第五部分代码
// 第五部分
// 依赖相关处理
if (earlySingletonExposure) {
Object earlySingletonReference = getSingleton(beanName, false);
if (earlySingletonReference != null) {
if (exposedObject == bean) {
exposedObject = earlySingletonReference;
}
else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
String[] dependentBeans = getDependentBeans(beanName);
Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
for (String dependentBean : dependentBeans) {
if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
actualDependentBeans.add(dependentBean);
}
}
if (!actualDependentBeans.isEmpty()) {
throw new BeanCurrentlyInCreationException(
beanName,
"Bean with name '" + beanName + "' has been injected into other beans [" +
StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
"] in its raw version as part of a circular reference, but has eventually been " +
"wrapped. This means that said other beans do not use the final version of the " +
"bean. This is often the result of over-eager type matching - consider using " +
"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example."
);
}
}
}
}
第五部分是进行一个依赖处理, 主要是检查是否存在依赖问题.
下面继续阅读doCreateBean
的第六部分代码
// 第六部分
// Register bean as disposable.
try {
// 注册bean(一次性的bean)
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
}
return exposedObject;
第六部分代码主要关注 registerDisposableBeanIfNecessary
方法详细分析请查看 分析文章
在第六部分的最后就是一个返回了.
至此 doCreateBean
的完整分析已经结束. 下面贴出完整代码
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// 第一部分
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
// 是否单例
if (mbd.isSingleton()) {
// beanFactory 移除当前创建的beanName
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
// beanWrapper 是否存在
if (instanceWrapper == null) {
// 创建 bean 实例
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// 第二部分
// 获取 实例
final Object bean = instanceWrapper.getWrappedInstance();
// beanWrapper中存储的实例.class
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
// Allow post-processors to modify the merged bean definition.
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
// 后置方法执行 BeanPostProcessor -> MergedBeanDefinitionPostProcessor
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of merged bean definition failed", ex
);
}
mbd.postProcessed = true;
}
}
// 第三部分
// Eagerly cache singletons to be able to resolve circular references
// even when triggered by lifecycle interfaces like BeanFactoryAware.
// 是否需要提前暴露
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
// 单例对象暴露
if (earlySingletonExposure) {
if (logger.isTraceEnabled()) {
logger.trace("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
// 添加单例工厂
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
// 第四部分
// 实例化bean
// Initialize the bean instance.
Object exposedObject = bean;
try {
// 设置属性
populateBean(beanName, mbd, instanceWrapper);
// 实例化bean
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
catch (Throwable ex) {
if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
throw (BeanCreationException) ex;
}
else {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
}
}
// 第五部分
// 依赖相关处理
if (earlySingletonExposure) {
Object earlySingletonReference = getSingleton(beanName, false);
if (earlySingletonReference != null) {
if (exposedObject == bean) {
exposedObject = earlySingletonReference;
}
else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
// 当前bean的依赖列表
String[] dependentBeans = getDependentBeans(beanName);
// 当前bean的依赖列表
Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
for (String dependentBean : dependentBeans) {
if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
actualDependentBeans.add(dependentBean);
}
}
if (!actualDependentBeans.isEmpty()) {
throw new BeanCurrentlyInCreationException(
beanName,
"Bean with name '" + beanName + "' has been injected into other beans [" +
StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
"] in its raw version as part of a circular reference, but has eventually been " +
"wrapped. This means that said other beans do not use the final version of the " +
"bean. This is often the result of over-eager type matching - consider using " +
"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example."
);
}
}
}
}
// 第六部分
// Register bean as disposable.
try {
// 注册bean(一次性的bean)
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
}
return exposedObject;
}
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#autowireBean
方法作用: 注入bean
/**
* 注入 bean
*/
@Override
public void autowireBean(Object existingBean) {
// Use non-singleton bean definition, to avoid registering bean as dependent bean.
// 创建 BeanDefinition
RootBeanDefinition bd = new RootBeanDefinition(ClassUtils.getUserClass(existingBean));
// 设置 scope
bd.setScope(SCOPE_PROTOTYPE);
// 是否缓存
bd.allowCaching = ClassUtils.isCacheSafe(bd.getBeanClass(), getBeanClassLoader());
// 创建 beanWrapper
BeanWrapper bw = new BeanWrapperImpl(existingBean);
initBeanWrapper(bw);
// 属性设置
populateBean(bd.getBeanClass().getName(), bd, bw);
}
在autowireBean
方法中处理的几个方法都是前文所讲述过的内容,请各位向上搜索一下进行阅读
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#configureBean
方法作用: 配置bean
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#autowire
/**
* 配置bean信息
*
*/
@Override
public Object configureBean(Object existingBean, String beanName) throws BeansException {
// 标记 beanName 正在创建
markBeanAsCreated(beanName);
// 获取合并的 beanDefinition
BeanDefinition mbd = getMergedBeanDefinition(beanName);
RootBeanDefinition bd = null;
if (mbd instanceof RootBeanDefinition) {
RootBeanDefinition rbd = (RootBeanDefinition) mbd;
// 是否原型bean. 如果是原型bean会做深度拷贝
bd = (rbd.isPrototype() ? rbd : rbd.cloneBeanDefinition());
}
if (bd == null) {
bd = new RootBeanDefinition(mbd);
}
if (!bd.isPrototype()) {
bd.setScope(SCOPE_PROTOTYPE);
bd.allowCaching = ClassUtils.isCacheSafe(ClassUtils.getUserClass(existingBean), getBeanClassLoader());
}
// bean 包装接口
BeanWrapper bw = new BeanWrapperImpl(existingBean);
initBeanWrapper(bw);
// 设置属性
populateBean(beanName, bd, bw);
// 实例化 bean
return initializeBean(beanName, existingBean, bd);
}j'a
configureBean
方法处理逻辑
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#autowireBeanProperties
@Override
public void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
throws BeansException {
// 注入形式是否是构造函数注入
if (autowireMode == AUTOWIRE_CONSTRUCTOR) {
throw new IllegalArgumentException("AUTOWIRE_CONSTRUCTOR not supported for existing bean instance");
}
// Use non-singleton bean definition, to avoid registering bean as dependent bean.
// beanDefinition 创建
RootBeanDefinition bd =
new RootBeanDefinition(ClassUtils.getUserClass(existingBean), autowireMode, dependencyCheck);
bd.setScope(SCOPE_PROTOTYPE);
BeanWrapper bw = new BeanWrapperImpl(existingBean);
initBeanWrapper(bw);
populateBean(bd.getBeanClass().getName(), bd, bw);
}
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPropertyValues
@Override
public void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException {
// 标记 beanName 正在创建
markBeanAsCreated(beanName);
BeanDefinition bd = getMergedBeanDefinition(beanName);
BeanWrapper bw = new BeanWrapperImpl(existingBean);
initBeanWrapper(bw);
// 应用属性
applyPropertyValues(beanName, bd, bw, bd.getPropertyValues());
}
在applyBeanPropertyValues
方法中有几个方法需要关注
markBeanAsCreated
: 标记beanName 正在被创建,分析文章
applyPropertyValues
: 属性应用这里着重对applyPropertyValues
进行分析
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyPropertyValues
方法作用: 属性应用
先看第一部分代码
// 第一部分
if (pvs.isEmpty()) {
return;
}
if (System.getSecurityManager() != null && bw instanceof BeanWrapperImpl) {
((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());
}
// 第二部分
MutablePropertyValues mpvs = null;
// 原始属性列表
List<PropertyValue> original;
// 类型判断
if (pvs instanceof MutablePropertyValues) {
// 强制类型转换
mpvs = (MutablePropertyValues) pvs;
if (mpvs.isConverted()) {
// Shortcut: use the pre-converted values as-is.
try {
// 包装对象的属性设置
bw.setPropertyValues(mpvs);
return;
}
catch (BeansException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Error setting property values", ex);
}
}
original = mpvs.getPropertyValueList();
}
else {
original = Arrays.asList(pvs.getPropertyValues());
}
第二部分主要处理 beanWrapper 的PropertyValues变量
applyPropertyValues
中的第一部分和第二部分的代码难度和细节不是很多. 下面开始第三部分的分析,第三部分的代码内容也是简单行为. 获取数据对象等待后续使用
// 第三部分
// 自定义转换器
TypeConverter converter = getCustomTypeConverter();
if (converter == null) {
converter = bw;
}
// 创建BeanDefinitionValueResolver
BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);
继续阅读 applyPropertyValues
的第四部分代码
// 第四部分
// Create a deep copy, resolving any references for values.
// 解析后的对象集合
List<PropertyValue> deepCopy = new ArrayList<>(original.size());
boolean resolveNecessary = false;
for (PropertyValue pv : original) {
// 解析过的属性
if (pv.isConverted()) {
deepCopy.add(pv);
}
// 没有解析过的属性
else {
// 属性名称
String propertyName = pv.getName();
// 属性值,直接读取到的
Object originalValue = pv.getValue();
if (originalValue == AutowiredPropertyMarker.INSTANCE) {
// 获取写方法. (set) 方法
Method writeMethod = bw.getPropertyDescriptor(propertyName).getWriteMethod();
if (writeMethod == null) {
throw new IllegalArgumentException("Autowire marker for property without write method: " + pv);
}
originalValue = new DependencyDescriptor(new MethodParameter(writeMethod, 0), true);
}
// 解析值
Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
Object convertedValue = resolvedValue;
/**
* 1. isWritableProperty: 属性可写
* 2. isNestedOrIndexedProperty: 是否循环嵌套
*/
boolean convertible = bw.isWritableProperty(propertyName) &&
!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
if (convertible) {
// 转换器解析
convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);
}
// Possibly store converted value in merged bean definition,
// in order to avoid re-conversion for every created bean instance.
if (resolvedValue == originalValue) {
if (convertible) {
pv.setConvertedValue(convertedValue);
}
deepCopy.add(pv);
}
// 类型解析
else if (convertible && originalValue instanceof TypedStringValue &&
!((TypedStringValue) originalValue).isDynamic() &&
!(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {
pv.setConvertedValue(convertedValue);
deepCopy.add(pv);
}
else {
resolveNecessary = true;
deepCopy.add(new PropertyValue(pv, convertedValue));
}
}
}
第四部分逻辑
获取 属性值
找到属性值的set
方法
Method writeMethod = bw.getPropertyDescriptor(propertyName).getWriteMethod();
装配描述对象DependencyDescriptor
originalValue = new DependencyDescriptor(new MethodParameter(writeMethod, 0), true)
解析对象
Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
类型转换
convertForProperty(resolvedValue, propertyName, bw, converter)
设置数据
pv.setConvertedValue(convertedValue)
看方法applyPropertyValues
的第五部分
// 第五部分
if (mpvs != null && !resolveNecessary) {
// 设置转换成功的标记
mpvs.setConverted();
}
// Set our (possibly massaged) deep copy.
try {
// 属性值设置
bw.setPropertyValues(new MutablePropertyValues(deepCopy));
}
catch (BeansException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Error setting property values", ex);
}
第五部分的代码是处理最后的一些标记位和值
propertyValues
字段方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#predictBeanType
方法作用: 类型推断
在predictBeanType
有两种类型推断的方式
determineTargetType
进行推断. (关于determineTargetType
的分析可以往上翻一下CTRL + F)SmartInstantiationAwareBeanPostProcessor
接口的predictBeanType
方法返回值来获取@Override
@Nullable
protected Class<?> predictBeanType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
// determineTargetType 进行推断
Class<?> targetType = determineTargetType(beanName, mbd, typesToMatch);
// Apply SmartInstantiationAwareBeanPostProcessors to predict the
// eventual type after a before-instantiation shortcut.
// 通过 SmartInstantiationAwareBeanPostProcessor 的 predictBeanType 得到类型
if (targetType != null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
boolean matchingOnlyFactoryBean = typesToMatch.length == 1 && typesToMatch[0] == FactoryBean.class;
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
Class<?> predicted = ibp.predictBeanType(targetType, beanName);
if (predicted != null &&
(!matchingOnlyFactoryBean || FactoryBean.class.isAssignableFrom(predicted))) {
return predicted;
}
}
}
}
return targetType;
}
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getTypeForFactoryBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, boolean)
ResolvableType
)getTypeForFactoryBean
方法内容也是一个比较大的方法.其中涉及到的内容还是比较多的.
// 第一部分
// Check if the bean definition itself has defined the type with an attribute
// 从 属性中获取
ResolvableType result = getTypeForFactoryBeanFromAttributes(mbd);
if (result != ResolvableType.NONE) {
return result;
}
在getTypeForFactoryBean
方法的第一部分中依靠AttributeAccessor
存储了factoryBeanObjectType
的一个属性. 从中直接获取就是ResolvableType
作为返回. 这也就是getTypeForFactoryBeanFromAttributes
的逻辑
// 第二部分
// bean class 转换成 ResolvableType
ResolvableType beanType =
(mbd.hasBeanClass() ? ResolvableType.forClass(mbd.getBeanClass()) : ResolvableType.NONE);
// bean 类型处理
// For instance supplied beans try the target type and bean class
if (mbd.getInstanceSupplier() != null) {
// bean 目标类型处理
result = getFactoryBeanGeneric(mbd.targetType);
if (result.resolve() != null) {
return result;
}
// bean 原始类型处理
result = getFactoryBeanGeneric(beanType);
if (result.resolve() != null) {
return result;
}
}
在getTypeForFactoryBean
方法的第二部分中处理了两种类型
BeanDefinition的目标类型
result = getFactoryBeanGeneric(mbd.targetType)
Bean原始类型=>BeanType(BeanClass)
result = getFactoryBeanGeneric(beanType)
通过阅读代码可以发现这里都依赖getFactoryBeanGeneric
方法. 下面对其进行分析
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getFactoryBeanGeneric
private ResolvableType getFactoryBeanGeneric(@Nullable ResolvableType type) {
if (type == null) {
return ResolvableType.NONE;
}
return type.as(FactoryBean.class).getGeneric();
}
这里请阅读: ResolvableType
的分析文章
// 第三部分
// Consider factory methods
// 提取 factory Bean Name
String factoryBeanName = mbd.getFactoryBeanName();
// 提取 factory method
String factoryMethodName = mbd.getFactoryMethodName();
// Scan the factory bean methods
if (factoryBeanName != null) {
if (factoryMethodName != null) {
// Try to obtain the FactoryBean's object type from its factory method
// declaration without instantiating the containing bean at all.
// 获取 bean Definition
BeanDefinition factoryBeanDefinition = getBeanDefinition(factoryBeanName);
Class<?> factoryBeanClass;
if (factoryBeanDefinition instanceof AbstractBeanDefinition &&
((AbstractBeanDefinition) factoryBeanDefinition).hasBeanClass()) {
// 从 bean definition 中获取bean类型
factoryBeanClass = ((AbstractBeanDefinition) factoryBeanDefinition).getBeanClass();
}
else {
// 获取合并的beanDefinition
RootBeanDefinition fbmbd = getMergedBeanDefinition(factoryBeanName, factoryBeanDefinition);
// bean 类型推测
factoryBeanClass = determineTargetType(factoryBeanName, fbmbd);
}
if (factoryBeanClass != null) {
// 从 工厂方法中获取类型描述 ResolvableType
result = getTypeForFactoryBeanFromMethod(factoryBeanClass, factoryMethodName);
if (result.resolve() != null) {
return result;
}
}
}
// If not resolvable above and the referenced factory bean doesn't exist yet,
// exit here - we don't want to force the creation of another bean just to
// obtain a FactoryBean's object type...
// 是否需要做元数据缓存
if (!isBeanEligibleForMetadataCaching(factoryBeanName)) {
return ResolvableType.NONE;
}
}
getTypeForFactoryBean
的第三部分代码主要是对 ~~工厂函数的处理(FactoryMethod)~~和 FactoryBeanName 的处理
处理方式:
获取factoryBeanName
的BeanDefinition
BeanDefinition factoryBeanDefinition = getBeanDefinition(factoryBeanName);
BeanDefinition
的类型可能是AbstractBeanDefinition
getBeanClass
得到 FactoryBeanClass
Class<?> factoryBeanClass;
if (factoryBeanDefinition instanceof AbstractBeanDefinition &&
((AbstractBeanDefinition) factoryBeanDefinition).hasBeanClass()) {
// 从 bean definition 中获取bean类型
factoryBeanClass = ((AbstractBeanDefinition) factoryBeanDefinition).getBeanClass();
}
获取factoryBeanName
和factoryBeanDefinition
的合并定义
// 获取合并的beanDefinition
RootBeanDefinition fbmbd = getMergedBeanDefinition(factoryBeanName, factoryBeanDefinition);
// bean 类型推测
factoryBeanClass = determineTargetType(factoryBeanName, fbmbd);
从工厂方法中获取类型
result = getTypeForFactoryBeanFromMethod(factoryBeanClass, factoryMethodName);
if (result.resolve() != null) {
return result;
}
getTypeForFactoryBeanFromMethod
进行分析org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getTypeForFactoryBeanFromMethod
private ResolvableType getTypeForFactoryBeanFromMethod(Class<?> beanClass, String factoryMethodName) {
// CGLIB subclass methods hide generic parameters; look at the original user class.
// 获取bean类型
Class<?> factoryBeanClass = ClassUtils.getUserClass(beanClass);
// 创建查询类
FactoryBeanMethodTypeFinder finder = new FactoryBeanMethodTypeFinder(factoryMethodName);
// 执行方法 `doWith`
ReflectionUtils.doWithMethods(factoryBeanClass, finder, ReflectionUtils.USER_DECLARED_METHODS);
// 获取结果
return finder.getResult();
}
在这段(getTypeForFactoryBeanFromMethod
)方法中有两个关注点
FactoryBeanMethodTypeFinder
是什么?ReflectionUtils.doWithMethods
执行了什么?那么下面对两个问题进行回答
回答完了这个方法也就清晰了
首先解决第一个问题 FactoryBeanMethodTypeFinder
是什么?
FactoryBeanMethodTypeFinder
是一个类
类全路径:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.FactoryBeanMethodTypeFinder
类图
这里的类图很重要. 这个接口MethodCallback
会被重写先看看MethodCallback
的代码
@FunctionalInterface
public interface MethodCallback {
/**
* Perform an operation using the given method.
* @param method the method to operate on
*/
void doWith(Method method) throws IllegalArgumentException, IllegalAccessException;
}
看到这里结合ReflectionUtils.doWithMethods
这个信息, 大概能推断出第二个问题的答案了.
ReflectionUtils.doWithMethods
执行了什么?
ReflectionUtils.doWithMethods
就是执行了 MethodCallback
的doWith
方法
public static void doWithMethods(Class<?> clazz, MethodCallback mc, @Nullable MethodFilter mf) {
// Keep backing up the inheritance hierarchy.
Method[] methods = getDeclaredMethods(clazz, false);
for (Method method : methods) {
if (mf != null && !mf.matches(method)) {
continue;
}
try {
mc.doWith(method);
}
catch (IllegalAccessException ex) {
throw new IllegalStateException("Not allowed to access method '" + method.getName() + "': " + ex);
}
}
if (clazz.getSuperclass() != null && (mf != USER_DECLARED_METHODS || clazz.getSuperclass() != Object.class)) {
doWithMethods(clazz.getSuperclass(), mc, mf);
}
else if (clazz.isInterface()) {
for (Class<?> superIfc : clazz.getInterfaces()) {
doWithMethods(superIfc, mc, mf);
}
}
}
下面阅读FactoryBeanMethodTypeFinder#doWith
方法
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.FactoryBeanMethodTypeFinder#doWith
@Override
public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
// 是否是 FactoryBean
if (isFactoryBeanMethod(method)) {
// 获取 返回值 解析类型对象
ResolvableType returnType = ResolvableType.forMethodReturnType(method);
ResolvableType candidate = returnType.as(FactoryBean.class).getGeneric();
if (this.result == ResolvableType.NONE) {
this.result = candidate;
}
else {
// result 解析得到类型
Class<?> resolvedResult = this.result.resolve();
// 获取 父类型
Class<?> commonAncestor = ClassUtils.determineCommonAncestor(candidate.resolve(), resolvedResult);
// 是否相同的验证
if (!ObjectUtils.nullSafeEquals(resolvedResult, commonAncestor)) {
// 解析结果
this.result = ResolvableType.forClass(commonAncestor);
}
}
}
}
getTypeForFactoryBean
第三部分的分析结束, 下面继续阅读第四部分的代码// 第四部分
// If we're allowed, we can create the factory bean and call getObjectType() early
if (allowInit) {
FactoryBean<?> factoryBean = (mbd.isSingleton() ?
// 单例 工厂bean验证
getSingletonFactoryBeanForTypeCheck(beanName, mbd) :
// 非 单例 工厂bean验证
getNonSingletonFactoryBeanForTypeCheck(beanName, mbd));
if (factoryBean != null) {
// Try to obtain the FactoryBean's object type from this early stage of the instance.
// factoryBean 中获取bean类型
Class<?> type = getTypeForFactoryBean(factoryBean);
if (type != null) {
// 转换成 ResolvableType对象
return ResolvableType.forClass(type);
}
// No type found for shortcut FactoryBean instance:
// fall back to full creation of the FactoryBean instance.
// 父类 通过 doGetBean 然后转换成 ResolvableType 对象
return super.getTypeForFactoryBean(beanName, mbd, true);
}
}
在getTypeForFactoryBean
第四部分中开始上来一个判断来获取 FactoryBean
FactoryBean<?> factoryBean = (mbd.isSingleton() ?
// 单例 工厂bean验证
getSingletonFactoryBeanForTypeCheck(beanName, mbd) :
// 非 单例 工厂bean验证
getNonSingletonFactoryBeanForTypeCheck(beanName, mbd));
在获取 FactoryBean 之后的行为
从 FactoryBean
调用getObjectType
方法获取class在转换成ResolvableType
Class<?> type = getTypeForFactoryBean(factoryBean);
if (type != null) {
// 转换成 ResolvableType对象
return ResolvableType.forClass(type);
}
父类处理getTypeForFactoryBean
处理方式
FactoryBean 中获取类型, 转换
FactoryBean<?> factoryBean = doGetBean(FACTORY_BEAN_PREFIX + beanName, FactoryBean.class, null, true);
Class<?> objectType = getTypeForFactoryBean(factoryBean);
return (objectType != null) ? ResolvableType.forClass(objectType) : ResolvableType.NONE;
第四部分的整体流程如上所述. 下面对两个获取FactoryBean进行分析
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getSingletonFactoryBeanForTypeCheck
@Nullable
private FactoryBean<?> getSingletonFactoryBeanForTypeCheck(String beanName, RootBeanDefinition mbd) {
synchronized (getSingletonMutex()) {
// 获取 beanName 对应的 BeanWrapper
BeanWrapper bw = this.factoryBeanInstanceCache.get(beanName);
if (bw != null) {
// 直接返回 beanWrapper 的强制转换
return (FactoryBean<?>) bw.getWrappedInstance();
}
// 获取单例对象
Object beanInstance = getSingleton(beanName, false);
// 类型比较
if (beanInstance instanceof FactoryBean) {
return (FactoryBean<?>) beanInstance;
}
if (isSingletonCurrentlyInCreation(beanName) ||
(mbd.getFactoryBeanName() != null && isSingletonCurrentlyInCreation(mbd.getFactoryBeanName()))) {
return null;
}
Object instance;
try {
// Mark this bean as currently in creation, even if just partially.
// 创建前的验证
beforeSingletonCreation(beanName);
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
// 实例解析
instance = resolveBeforeInstantiation(beanName, mbd);
if (instance == null) {
// 创建 beanWrapper
bw = createBeanInstance(beanName, mbd, null);
// 获取实例
instance = bw.getWrappedInstance();
}
}
catch (UnsatisfiedDependencyException ex) {
// Don't swallow, probably misconfiguration...
throw ex;
}
catch (BeanCreationException ex) {
// Instantiation failure, maybe too early...
if (logger.isDebugEnabled()) {
logger.debug("Bean creation exception on singleton FactoryBean type check: " + ex);
}
onSuppressedException(ex);
return null;
}
finally {
// Finished partial creation of this bean.
// 创建后的行为
afterSingletonCreation(beanName);
}
// 获取 factoryBean
// instance 强转 FactoryBean
FactoryBean<?> fb = getFactoryBean(beanName, instance);
if (bw != null) {
// 置入容器
this.factoryBeanInstanceCache.put(beanName, bw);
}
return fb;
}
}
getSingletonFactoryBeanForTypeCheck
方法的分析)方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getNonSingletonFactoryBeanForTypeCheck
在前文分析过getSingletonFactoryBeanForTypeCheck
后了解了这个的策略后, getNonSingletonFactoryBeanForTypeCheck
也就豁然了. 两者的差异就是创建对象的差异,其他的都一样,各位请查看下面的代码来做一个巩固。
@Nullable
private FactoryBean<?> getNonSingletonFactoryBeanForTypeCheck(String beanName, RootBeanDefinition mbd) {
// 是否处于原型模式下正在创建
if (isPrototypeCurrentlyInCreation(beanName)) {
return null;
}
Object instance;
try {
// Mark this bean as currently in creation, even if just partially.
// 原型模式下创建的 前置函数
beforePrototypeCreation(beanName);
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
// 实例解析
instance = resolveBeforeInstantiation(beanName, mbd);
if (instance == null) {
// 创建 bean 实例
BeanWrapper bw = createBeanInstance(beanName, mbd, null);
instance = bw.getWrappedInstance();
}
}
catch (UnsatisfiedDependencyException ex) {
// Don't swallow, probably misconfiguration...
throw ex;
}
catch (BeanCreationException ex) {
// Instantiation failure, maybe too early...
if (logger.isDebugEnabled()) {
logger.debug("Bean creation exception on non-singleton FactoryBean type check: " + ex);
}
onSuppressedException(ex);
return null;
}
finally {
// Finished partial creation of this bean.
// 原型模式下创建的 后置函数
afterPrototypeCreation(beanName);
}
return getFactoryBean(beanName, instance);
}
getSingletonFactoryBeanForTypeCheck
和 getNonSingletonFactoryBeanForTypeCheck
后就结束了第四部分的分析(getTypeForFactoryBean
). 下面进入第五部分的分析// 第五部分
if (factoryBeanName == null && mbd.hasBeanClass() && factoryMethodName != null) {
// No early bean instantiation possible: determine FactoryBean's type from
// static factory method signature or from class inheritance hierarchy...
// 从 工厂方法中获取类型描述 ResolvableType
return getTypeForFactoryBeanFromMethod(mbd.getBeanClass(), factoryMethodName);
}
// bean 原始类型处理
result = getFactoryBeanGeneric(beanType);
// 解析结果存在
if (result.resolve() != null) {
return result;
}
// 返回空
return ResolvableType.NONE;
第五部分的代码都是在getTypeForFactoryBean
方法中多次调用的. 这里就不展开了, 到这里整个方法分析结束
方法签名: org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference
方法作用: 执行容器中SmartInstantiationAwareBeanPostProcessor
的getEarlyBeanReference
方法
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
Object exposedObject = bean;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
}
}
}
return exposedObject;
}
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
BeanPostProcessor
接口获得对象)@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
// 是否需要在 bean 初始化之前做一些关于 beanPostProcessor 相关的行为
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
// 是否是合成bean
// 是否拥有 BeanPostProcessor 接口
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
// 目标类型确认
Class<?> targetType = determineTargetType(beanName, mbd);
// 前置方法 BeanPostProcessor 接口的调用
if (targetType != null) {
// postProcessBeforeInstantiation 执行
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
// 后置方法
// postProcessAfterInitialization 执行
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。