Spring源碼分析-深刻理解生命週期之BeanFactoryProcessor

生命週期之BeanFactoryPostProcessor

先來看看bean的生命週期。對於熟悉spring 的朋友來講,bean的生命週期並不陌生。它能夠在bean加載,bean初始化的過程當中加入咱們本身的邏輯。而且這樣體現了spring開放式的設計。先來看看生命週期的圖:spring

今天咱們要介紹的是生命週期中的BeanFactoryPostProcessor,那這個接口的做用是啥呢?它能夠對已經加載好的BeanDefinition進行處理。Spring IOC 允許BeanFactoryPostProcessor 在容器實際實例化任何bean以前讀取配置的元數據。有過Spring使用經驗的人對 ${property} 這樣的表達式確定很熟悉。它就是對配置信息進行替換。這樣使得配置解耦出來。而具體的邏輯就是在BeanFactoryPostProcessor相關的實現類的postProcessBeanFactory方法中實現的。post

具體實現邏輯本文不介紹。能夠看看BeanFactoryPostProcessor接口的幾個實現類(好比PropertyPlaceholderConfigurer)。設計

今天咱們拋出一個疑問:既然BeanFactoryPostProcessor是在Bean加載完畢後,Bean初始化完畢前起做用的。那咱們若是在xml配置文件中自定義一個BeanFactoryPostProcessor實現類,按照道理來講這個實現類都沒有初始化,是怎麼起做用的?cdn

先拋出答案:這個是特殊的bean,它在其餘普通bean以前實例化前真的被實例化了。而且若是咱們使用BeanFactory而不是用ApplicationContext,那麼配置的BeanFactoryPostProcessor實現類不會生效,而且BeanPostProcessor也不會生效。xml

分析:blog

緣由在於AbstractApplicationContext的 refresh方法中:接口

這個invokeBeanFactoryPostProcessors 恰好對BeanFactoryPostProcessor實現類進行了實例化,而且進行激活調用。生命週期

進去看看:get

能夠發現,源碼中有不少getBean方法,這個正是實例化BeanFactoryPostProcessor的方法。源碼

而且invokeBeanFactoryPostProcessors方法正是對invokeBeanFactoryPostProcessor實現類進行了激活,並對BeanDefinition進行了更改。

能夠看到這個for循環裏對BeanFactoryPostProcessor實現類進行了調用。

總結:本文開頭的圖只是ApplicationContext對應的生命週期,並非BeanFactory對應的bean的生命週期。由於我在BeanFactory實現中沒有找到BeanFactoryPostProcessor相應的實現邏輯。題外話,並且對於BeanPostProcessor來講spring容器啓動只是註冊實例化了BeanPostProcessor並無調用,而是容器啓動的末尾,對其餘bean 進行getBean時,纔會調用到這些BeanPostProcessor

心得:之前對Bean生命週期只是死記硬背,如今時豁然開朗。不須要死記硬背的,後面將會介紹bean生命週期其餘的過程。

相關文章
相關標籤/搜索