AutowiredAnnotationBeanPostProcessor和RequiredAnnotationBeanPostProcessor源码简析

20 篇文章 0 订阅

    首先声明,本人正在努力学习spring源码,如果有志同道合的朋友可以先私信然后加好友讨论。本文比较简单由于刚看不久更多的起到记录笔记的作用,欢迎各位大佬指出问题。

    首先提出问题:1.spring在什么时候开始解析@Autowired注解实现依赖注入的呢?2.@Qualifier又是如何与@Autowired配合使用的呢?

    首先要明确一点的是,在spring解析beanDefinition阶段会将bean定义的所有属性解析未beanDefinition实例,在对bean进行实例化时会根据beanDefinition实例进行相应操作。这里要稍微提一点就是 在抽象类AbstractBeanDefinition中定义了

AUTOWIRE_NO:不进行依赖注入,但是对于BeanFactoryAware与annotation-driven 注入还是会使用依赖注入,所以对使用了@Autowired注解的依然执行依赖注入

AUTOWIRE_BY_NAME:表示根据名称注入

AUTOWIRE_BY_TYPE:表示根据类型注入

AUTOWIRE_CONSTRUCTOR:表示根据最贪婪的构造器注入(我的理解就是注入满足参数最多的那个构造器)

 

   在AutowiredAnnotationBeanPostProcessor源码里我们会发现它实现了接口MergedBeanDefinitionPostProcessor和继承了InstantiationAwareBeanPostProcessorAdapter类,这两个类在spring里起了很重要的作用这里暂时先不展开了待以后博客单独说。

AutowiredAnnotationBeanPostProcessor类里分别实现了MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法和InstantiationAwareBeanPostProcessorAdapter的postProcessPropertyValues方法。在这两个方法里都执行了findAutowiringMetadata方法,至于为什么要执行两遍,我百思不得其解。因为在postProcessMergedBeanDefinition方法里没做说明事就直接看postProcessPropertyValues方法吧。

进入findAutowiringMetadata方法后首先调用needRefresh方法判是否需要刷新,如果缓存中有的话或者metadata里的class与当前传来的class不是一个就需要刷新

进入到buildAutowiringMetadata方法,在buildAutowiringMetadata方法里会对clazz进行属性和方法的解析分别获取是否有@Autowired注解。

判断是否有@Autowired注解是通过AutowiredAnnotationBeanPostProcessor的属性autowiredAnnotationTypes来判断是否满足。而autowiredAnnotationTypes属性是可以设置修改的,所以AutowiredAnnotationBeanPostProcessor不仅仅是可以解析@Autowired注解还可以解析自定义的依赖注入注解

可以通过实现BeanFactoryPostProcessor来实现

RequiredAnnotationBeanPostProcessor很简单在postProcessPropertyValues方法里通过isRequiredProperty方法判断当前属性的writeMethod是否有@required的注解,有的话通过pvs判断是否包含当前属性名称的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值