spring源碼解析 - spring後置處理器埋點設計

前言

spring容器在加載階段,有一些很是重要相似於埋點的設計(這個概念叫法不統一,有的稱爲「後置處理器」)。本文暫且以接口的字面意思叫做後置處理器(PostProcessor)。這些後置處理器的設計擴展了spring容器的功能。它容許自定義不一樣類型的後置處理器,實現外部對bean和beandefinition的處理節點、加載時機等的干預,從而知足項目的個性化需求。spring

Spring中的後置處理器

spring源碼解析 - spring後置處理器埋點設計
其中最重要的三大組件爲:ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor等。
下面咱們先來看下以上組件在spring源碼中的埋點(處理節點設計)
BeanDefinition註冊階段
ClassPathXmlApplicationContext容器實現,對以上三大組件的註冊點
spring源碼解析 - spring後置處理器埋點設計架構

spring源碼解析 - spring後置處理器埋點設計
AnnotationConfigApplicationContext容器實現,對以上三大組件的註冊點
spring源碼解析 - spring後置處理器埋點設計app

spring源碼解析 - spring後置處理器埋點設計
觸發BeanDefinition干預階段
spring源碼解析 - spring後置處理器埋點設計ide

spring源碼解析 - spring後置處理器埋點設計

具體處理流程
spring源碼解析 - spring後置處理器埋點設計插件

對應的源碼實現
spring源碼解析 - spring後置處理器埋點設計設計

Bean實例化前置階段
spring源碼解析 - spring後置處理器埋點設計3d

PostProcessorRegistrationDelegate.registerBeanPostProcessors()提早實例化BeanPostProcessor組件,以便後面實例化其它bean時使用
spring源碼解析 - spring後置處理器埋點設計代理

Bean實例化後置階段br/>AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation()處理@Bean,factoryMethod等外部實例化埋點
spring源碼解析 - spring後置處理器埋點設計對象

spring源碼解析 - spring後置處理器埋點設計

spring源碼解析 - spring後置處理器埋點設計
AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors()收集bean對象的依賴屬性和方法注入等信息
spring源碼解析 - spring後置處理器埋點設計blog

spring源碼解析 - spring後置處理器埋點設計
AbstractAutowireCapableBeanFactory.populateBean()bean對象依賴注入賦值
spring源碼解析 - spring後置處理器埋點設計

spring源碼解析 - spring後置處理器埋點設計
AbstractAutowireCapableBeanFactory.initializeBean()對bean對象生成Aop動態代理的相關處理
spring源碼解析 - spring後置處理器埋點設計

spring源碼解析 - spring後置處理器埋點設計

spring源碼解析 - spring後置處理器埋點設計

spring源碼解析 - spring後置處理器埋點設計

spring源碼解析 - spring後置處理器埋點設計

後置處理器的應用

三大後置處理器,在實際項目使用得並非不少,但也有項目會使用到以下的場景:1.在beandefinition註冊後,須要在運行時對容器中的beandefinition進行加強或干預;2.在bean實例化過程當中,某個類不但願在spring中進行實例化;3.但願容器啓動後,作一些全局的業務邏輯;4.開發spring的插件須要和spring進行集成或對接等。下面就舉例看一些自定義後置處理器的場景:
BeanDefinitionRegistryPostProcessor擴展
spring源碼解析 - spring後置處理器埋點設計
BeanFactoryPostProcesser擴展
spring源碼解析 - spring後置處理器埋點設計
InitializingBean,Bean實例化擴展
spring源碼解析 - spring後置處理器埋點設計

結束語

關於spring後置處理器的源碼就暫時分享到這裏,更多後置處理器的使用場景,有興趣的能夠花時間研究一下spring容器加載過程的源碼。這種東西,使用場景並不像註解那樣廣泛,但也有它的用武之地(尤爲是作設計或架構)。你們能夠根據本身的項目和工做角色進行選擇。今天就到這裏,更多spring源碼的乾貨,請繼續關注!

相關文章
相關標籤/搜索