同步操作将从 huifer/Code-Analysis 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
org.springframework.beans.factory.support.GenericTypeAwareAutowireCandidateResolver
org.springframework.beans.factory.support.GenericTypeAwareAutowireCandidateResolver.checkGenericTypeMatch
首先了解参数
方法主要目的验证: Bean 定义持有对象的 bean 类型是否和依赖描述对象的类型相同
下面开始阅读第一部分代码
第一部分代码交代了一些基础变量的获取
// 第一部分
// 类型描述的解析对象
// 依赖类型
ResolvableType dependencyType = descriptor.getResolvableType();
// 依赖类型 是否是 class
if (dependencyType.getType() instanceof Class) {
// No generic type -> we know it's a Class type-match, so no need to check again.
return true;
}
ResolvableType targetType = null;
boolean cacheType = false;
RootBeanDefinition rbd = null;
// 从 bean定义持有对象中获取 bean定义
if (bdHolder.getBeanDefinition() instanceof RootBeanDefinition) {
rbd = (RootBeanDefinition) bdHolder.getBeanDefinition();
}
继续阅读第二部分代码 第二部分代码围绕 targetType 这个变量展开, 描述了其获取过程
// 第二部分
if (rbd != null) {
targetType = rbd.targetType;
if (targetType == null) {
cacheType = true;
// First, check factory method return type, if applicable
// 工厂方法的返回值
targetType = getReturnTypeForFactoryMethod(rbd, descriptor);
if (targetType == null) {
// 解析 RootBeanDefinition
RootBeanDefinition dbd = getResolvedDecoratedDefinition(rbd);
if (dbd != null) {
targetType = dbd.targetType;
if (targetType == null) {
// 工厂方法的返回值
targetType = getReturnTypeForFactoryMethod(dbd, descriptor);
}
}
}
}
}
第二部分中出现了两个方法 1. getReturnTypeForFactoryMethod 2. getResolvedDecoratedDefinition 这两个方法我们也需要对其进行了解.
org.springframework.beans.factory.support.GenericTypeAwareAutowireCandidateResolver.getReturnTypeForFactoryMethod
在了解RootBeanDefinition
对象的前提下, 我们知道其中存有factoryMethodReturnType
和factoryMethodToIntrospect
这两个属性都是有可能成为这个方法的操作对象.
1. factoryMethodReturnType
可以直接作为返回值
2. factoryMethodToIntrospect
类型是 Method
需要获取 return class 在转换成返回对象
围绕上述两点来看下面的代码比较容易理解
@Nullable
protected ResolvableType getReturnTypeForFactoryMethod(RootBeanDefinition rbd, DependencyDescriptor descriptor) {
// Should typically be set for any kind of factory method, since the BeanFactory
// pre-resolves them before reaching out to the AutowireCandidateResolver...
ResolvableType returnType = rbd.factoryMethodReturnType;
if (returnType == null) {
Method factoryMethod = rbd.getResolvedFactoryMethod();
if (factoryMethod != null) {
returnType = ResolvableType.forMethodReturnType(factoryMethod);
}
}
if (returnType != null) {
Class<?> resolvedClass = returnType.resolve();
if (resolvedClass != null && descriptor.getDependencyType().isAssignableFrom(resolvedClass)) {
// Only use factory method metadata if the return type is actually expressive enough
// for our dependency. Otherwise, the returned instance type may have matched instead
// in case of a singleton instance having been registered with the container already.
return returnType;
}
}
return null;
}
org.springframework.beans.factory.support.GenericTypeAwareAutowireCandidateResolver.getResolvedDecoratedDefinition
通过当前bean定义来获取与之对应的依赖对象, 然后返回
@Nullable
protected RootBeanDefinition getResolvedDecoratedDefinition(RootBeanDefinition rbd) {
// 获取 bean 定义持有对象(依赖的对象)
BeanDefinitionHolder decDef = rbd.getDecoratedDefinition();
if (decDef != null && this.beanFactory instanceof ConfigurableListableBeanFactory) {
ConfigurableListableBeanFactory clbf = (ConfigurableListableBeanFactory) this.beanFactory;
if (clbf.containsBeanDefinition(decDef.getBeanName())) {
BeanDefinition dbd = clbf.getMergedBeanDefinition(decDef.getBeanName());
if (dbd instanceof RootBeanDefinition) {
return (RootBeanDefinition) dbd;
}
}
}
return null;
}
回到主线继续阅读第三部分代码
// 第三部分
if (targetType == null) {
// Regular case: straight bean instance, with BeanFactory available.
// 普通情况: bean 实例存在 且有 BeanFactory
if (this.beanFactory != null) {
// beanFactory 获取 beanName 对应的 类型
Class<?> beanType = this.beanFactory.getType(bdHolder.getBeanName());
if (beanType != null) {
targetType = ResolvableType.forClass(ClassUtils.getUserClass(beanType));
}
}
// Fallback: no BeanFactory set, or no type resolvable through it
// -> best-effort match against the target class if applicable.
if (targetType == null && rbd != null && rbd.hasBeanClass() && rbd.getFactoryMethodName() == null) {
Class<?> beanClass = rbd.getBeanClass();
// beanClass 是否来自 FactoryBean
if (!FactoryBean.class.isAssignableFrom(beanClass)) {
targetType = ResolvableType.forClass(ClassUtils.getUserClass(beanClass));
}
}
}
第三部分的处理是针对 beanName 和 beanFactory. 1. 从 BeanFactory 中获取 BeanName 对应的类型, 转换成 ResolvableType 返回 2. 判断是否 FactoryBean 实现. 返回 ResolvableType
继续阅读第四部分 第四部分是最终结果返回
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。