进入方法autowireByName()
首先调用了unsatisfiedNonSimpleProperties()方法进行属性过滤
unsatisfiedNonSimpleProperties()
其中PropertyDescriptor是JavaBean通过存储器导出一个的一个属性,用于获取bw的所有属性描述对象,遍历获取到的属性描述对象,如果当前pd同时满足以下几点,则将该pd的属性名添加到result中
有写入属性方法(pd.getWriteMethod()!= null,即判断是否有setXxx()方法)
未被排除在依赖检查项之外(!isExcludedFromDependencyCheck(pd))
pvs中没有该pd的属性名(!pvs.contains(pd.getName()))
该pd的属性类型不是“简单类型”(!BeanUtils.isSimpleProperty(pd.getPropertyType()))
满足以下任一条件返回true:
"简单"值类型;
数组类型并且数组内的值为"简单"值类型
什么是"简单"值类型?我们进入方法isSimpleValueType()
这里的“简单”值类型需要同时满足三个条件:
值类型不为Void.class(Void.class != type)
值类型不为void.class(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
这里有两个方法需要介绍下(。・ω・。)ノ
isPrimitiveOrWrapper()
有没有客官感到疑惑🤔,方法名字叫判断是否是“简单”值类型,那么最简单的8大基本类型是在哪里进行判断的呢?
其中的isPrimitiveOrWrapper()方法通过isPrimitive()和isPrimitiveWrapper()两个方法,对是否为基本类型进行了判断
isPrimitive()
isPrimitive()是一个底层方法(被native修饰),当type为8大基本类型或者Void类型时,isPrimitive()方法会返回true
isPrimitiveWrapper()
isPrimitiveWrapper()也是一个底层方法(被native修饰),我们来看下primitiveWrapperTypeMap里面都有哪些类型,以及它是在哪里被赋值的
isAssignableFrom()
同样的,这个方法也是一个底层方法(被native修饰),它的作用是判断当前类是否是传入的参数类的父类、超接口,或者二者相同,满足任一情况则返回true
最后unsatisfiedNonSimpleProperties()方法返回过滤出非简单类型的属性
回到autowireByName()方法中,遍历属性名,如果该bean工厂有propertyName的beaDefinition或外部注册的singleton实例,就继续获取该工厂中该propertyName的bean对象,再将propertyName和该bean对象添加进pvs中,注册propertyName、beanName的依赖关系
registerDependentBean()
进入registerDependentBean()方法
嘿嘿最后再来一个问题( ̄∇ ̄):集合dependentBeanMap和dependenciesForBeanMap的区别是?
bean name to Set of dependent bean names.
bean name to Set of bean names for the bean's dependencies.
简单翻一下就是,一个放的是一个beanName和这个beanName所有依赖的beanNames;另一个放的是beanName和这个beanName所有依赖的bean对象
最后打印下🖨️追踪日志,registerDependentBean()方法结束