【Spring源码系列- IOC】
进入方法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()方法结束
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135367.html