【Spring源码系列- IOC】
像之前介绍CommonAnnotationBeanPostProcessor一样的,我们进入applyMergedBeanDefinitionPostProcessors()方法中的循环中,当遍历的BeanPostProcessor为AutowiredAnnotationBeanPostProcessor时,就开始了我们这篇文章⁄(⁄ ⁄ ⁄ω⁄ ⁄ ⁄)⁄~~~
进入bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName),找到AutowiredAnnotationBeanPostProcessor实现类
于是我们来到了AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()
findAutowiringMetadata()
方法中,先从缓存中获取该类的信息,进而根据获取到的metadata判断是否需要刷先缓存,如果需要则通过构建buildAutowiringMetadata()方法自动装配的属性和方法元数据
buildAutowiringMetadata()
先判断给定的类是否带有指定的注解
这里的autowiredAnnotationTypes会在AutowiredAnnotationBeanPostProcessor的构造函数中进行赋值
从上图可以看到autowiredAnnotationTypes包含3个对象:
Autowired.class
Value.class
(Class<? extends Annotation>) ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader())
前两个大家应该很熟悉(最后一个俺也不熟先不管他(˶‾᷄ ⁻̫ ‾᷅˵)),随后就开始了一个do{ }while()循环♻️
每次循环中进行了4个步骤:
先判断属性
遍历类中的每个属性,通过方法findAutowiredAnnotation()判断属性是否包含指定的注解,如果存在则保存为AutowriedFieldElement
注意⚠️@Autowried注解不支持静态属性
再判断方法
遍历类中的每个方法,通过方法findAutowiredAnnotation()判断方法是否包含指定的注解,如果存在则保存为AutowriedMerthodElement
注意⚠️@Autowried注解不支持静态方法
接着把他们添加进集合
最后获取其父类,直到其父类为空或者为Object.class结束循环
findAutowiredAnnotation()
在这个方法中会循环判断,但凡有一个属性/方法上标记了指定注解,就会立刻返回