首先声明,本人正在努力学习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判断是否包含当前属性名称的值