AutowiredAnnotationBeanPostProcessor和RequiredAnnotationBeanPostProcessor源碼簡析

    首先聲明,本人正在努力學習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判斷是否包含當前屬性名稱的值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章