<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在前面幾篇文章中梳理了Spring中bean的建立過程,在這個過程中各式各樣的後置處理器發揮了不同的作用,可以說後置處理器貫穿了bean的範例化以及初始化過程。在這篇文章中,將按照出場順序對後置處理器作用場景及發揮功能進行梳理。
AbstractAutowireCapableBeanFactory
的createBean
方法中呼叫,這時bean還沒有被範例化:
呼叫resolveBeforeInstantiation
方法:
applyBeanPostProcessorsBeforeInstantiation
方法:
在這裡,首先拿到spring中提供的所有後置處理器,判斷是不是InstantiationAwareBeanPostProcessor
。該後置處理器實現了BeanPostProcessor
,在這呼叫了postProcessBeforeInstantiation
方法。
這裡在目標物件被spring範例化之前呼叫,postProcessBeforeInstantiation
方法的返回值型別是Object
,可以返回任何型別的值。由於此時目標物件還未範例化,所以這個返回值可以用來代替原本該生成的目標物件的範例,一般為代理物件。
如果該方法的返回的Object
物件代替了原本該生成的目標物件,那麼就會把返回的物件放到單例池當中快取,後續只有BeanPostProcessor
的postProcessAfterInitialization
方法會呼叫,其它方法不再呼叫。
如果這裡返回了null
,就按照正常的流程建立物件,交給spring去負責物件的範例化。因此這個方法可以判斷這個物件在spring範例化之前是否要做特殊的處理,比如不交給Spring管理,自己使用代理產生。
在AbstractAutowireCapableBeanFactory
的createBeanInstance
方法中呼叫:
determineConstructorsFromBeanPostProcessors
方法,該方法用於推斷範例化的構造方法,這裡可能檢測出bean擁有多個候選構造方法:
SmartInstantiationAwareBeanPostProcessor
介面的實現類AutowiredAnnotationBeanPostProcessor
負責完成這個過程,如果有多個構造方法的情況下,ctors
會返回空,後續使用預設無參構造方法進行範例化。但是如果有一個構造方法上有@Autowired
註解,spring會優先選擇這個方法。
AbstractAutowireCapableBeanFactory
的doCreateBean
方法中呼叫:
applyMergedBeanDefinitionPostProcessors
方法:
在方法中對所有實現了MergedBeanDefinitionPostProcessor
介面的後置處理器進行遍歷,這裡具體呼叫AutowiredAnnotationBeanPostProcessor
,用於掃描需要注入的屬性。
AutowiredAnnotationBeanPostProcessor
中,定義了兩種需要掃描的註解型別,@Autowired
和@Value
在findAutowiredAnnotation
方法中:
對正在建立的bean進行掃描,如果有屬性和方法上面加了這兩個註解,就會把對應的方法或者屬性儲存,最終在buildAutowiringMetadata
方法中封裝成InjectionMetadata
物件。
需要注意這裡的後置處理器僅僅用於掃描及快取bean的注入資訊,這裡只完成了查詢功能,沒有完成屬性的注入,屬性的注入是在之後的另外的後置處理器中完成的。
在AbstractAutowireCapableBeanFactory
的doCreateBean
方法中呼叫,主要用於處理Bean的迴圈依賴:
在產生迴圈依賴後呼叫getEarlyBeanReference
方法:
在這裡遍歷後置處理器,得到經過後置處理器代理後的物件,放入spring的二級快取當中,提前暴露供迴圈參照的情況呼叫。注意這裡返回的僅僅是一個物件,還算不上是一個完整的bean物件。這個具體呼叫過程在上一篇講迴圈依賴的中的文章中講的比較詳細,如果有不明白的可以回顧一下。
在AbstractAutowireCapableBeanFactory
的populateBean
方法中呼叫:
在populateBean
方法中:
該方法在目標物件範例化之後呼叫,這個時候物件已經被範例化,但是該範例的屬性還未被設定,都是null
。
這裡遍歷後置處理器,如果實現了InstantiationAwareBeanPostProcessor
,那麼就呼叫postProcessAfterInstantiation
方法。如果方法返回值為true
,按照正常流程進行屬性值的填充;如果該方法返回false
,會忽略屬性值的設定過程。簡而言之,該後置處理器用於判斷當前範例化完成的bean需不需要進行屬性填充。
同樣在populateBean
方法中,在postProcessAfterInstantiation
後返回true
時執行,如果方法返回false
,該方法不會被呼叫。
遍歷後置處理器,如果屬於InstantiationAwareBeanPostProcessor
型別,則呼叫它的postProcessPropertyValues
方法。
這裡發揮作用的是AutowiredAnnotationBeanPostProcessor
,負責對新增了 @Autowired
和@Value
等註解的屬性進行依賴的填充。在其中遍歷所有需要注入的屬性的列表,使用反射將注入的bean範例賦值給屬性。(具體過程參照Spring範例化Bean原始碼解析)
AbstractAutowireCapableBeanFactory的doCreateBean
方法中呼叫initializeBeanfan
方法:
applyBeanPostProcessorsBeforeInitialization
方法中:
在該方法中,遍歷執行所有BeanPostProcessor
的postProcessBeforeInitialization
方法。
在執行該方法前,bean已經被範例化完成,並且完成了屬性的填充,因此這個過程屬於後續的bean的初始化過程。
需要注意的是,如果在bean中有方法被標註了@PostContrust
註解,那麼在CommonAnnotationBeanPostProcessor
中,會呼叫該@PostContrust
方法。
和第7次呼叫入口相同,也是在AbstractAutowireCapableBeanFactory
的initializeBean
方法中:
applyBeanPostProcessorsAfterInitialization
方法中:
遍歷執行所有BeanPostProcessor
的postProcessAfterInitialization
方法。綜上所述,bean的各種方法執行屬性為,先執行構造方法,再執行後置管理器中的before
方法及@PostContrust
方法,最後執行後置處理器的after
方法。
如果當前bean中有方法被@PreDestroy
註解標註,那麼當Spring的ApplicationContext
執行close
方法時呼叫該後置處理器。在DefaultSingletonBeanRegistry
中執行destroyBean
方法:
呼叫destroy
方法:
InitDestroyAnnotationBeanPostProcessor
的postProcessBeforeDestruction
方法:
在該方法中,呼叫@PreDestroy
註解標註的方法,執行銷燬方法。
本文對貫穿bean的範例化及初始化過程中出現的後置處理器進行了一下梳理,但是還有很多其他的後置處理器沒有講到。可以說後置處理器是spring提供給使用者的一些擴充套件點,如果能夠熟練的使用這些後置處理器,能夠幫助我們接觸到一些spring中比較深層的東西,並對spring中的生命週期進行有利的插手。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45