spring容器在加載階段,有一些很是重要相似於埋點的設計(這個概念叫法不統一,有的稱爲「後置處理器」)。本文暫且以接口的字面意思叫做後置處理器(PostProcessor)。這些後置處理器的設計擴展了spring容器的功能。它容許自定義不一樣類型的後置處理器,實現外部對bean和beandefinition的處理節點、加載時機等的干預,從而知足項目的個性化需求。spring
其中最重要的三大組件爲:ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor等。
下面咱們先來看下以上組件在spring源碼中的埋點(處理節點設計)
BeanDefinition註冊階段
ClassPathXmlApplicationContext容器實現,對以上三大組件的註冊點
架構
AnnotationConfigApplicationContext容器實現,對以上三大組件的註冊點
app
觸發BeanDefinition干預階段
ide
具體處理流程
插件
對應的源碼實現
設計
Bean實例化前置階段
3d
PostProcessorRegistrationDelegate.registerBeanPostProcessors()提早實例化BeanPostProcessor組件,以便後面實例化其它bean時使用
代理
Bean實例化後置階段br/>AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation()處理@Bean,factoryMethod等外部實例化埋點
對象
AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors()收集bean對象的依賴屬性和方法注入等信息
blog
AbstractAutowireCapableBeanFactory.populateBean()bean對象依賴注入賦值
AbstractAutowireCapableBeanFactory.initializeBean()對bean對象生成Aop動態代理的相關處理
三大後置處理器,在實際項目使用得並非不少,但也有項目會使用到以下的場景:1.在beandefinition註冊後,須要在運行時對容器中的beandefinition進行加強或干預;2.在bean實例化過程當中,某個類不但願在spring中進行實例化;3.但願容器啓動後,作一些全局的業務邏輯;4.開發spring的插件須要和spring進行集成或對接等。下面就舉例看一些自定義後置處理器的場景:
BeanDefinitionRegistryPostProcessor擴展
BeanFactoryPostProcesser擴展
InitializingBean,Bean實例化擴展
關於spring後置處理器的源碼就暫時分享到這裏,更多後置處理器的使用場景,有興趣的能夠花時間研究一下spring容器加載過程的源碼。這種東西,使用場景並不像註解那樣廣泛,但也有它的用武之地(尤爲是作設計或架構)。你們能夠根據本身的項目和工做角色進行選擇。今天就到這裏,更多spring源碼的乾貨,請繼續關注!