91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring bean中BeanPostProcessor怎么用

發布時間:2021-08-12 12:47:55 來源:億速云 閱讀:386 作者:小新 欄目:編程語言

這篇文章主要介紹了Spring bean中BeanPostProcessor怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言

之前有提到通過InitializingBean和Disposable等接口可以對bean的初始化和銷毀做一些自定義操作,那么有一點要注意,那僅僅是在bean被容器實例化之后的操作,在spring的世界里,要想對實例化這個過程做點什么,作為一個普通業務的開發人員,顯然不需要去繼承ApplicationContext或者BeanFactory,因為spring container為我們提供了一些接口,讓我們以插件的形式去擴展BeanFactory對bean的初始化操作,其中就有我們今天的主角——BeanPostProcessor(以下簡稱bpp)接口。

源碼,先睹為快

Spring bean中BeanPostProcessor怎么用

這個用法很簡單,它只有兩個方法,我們實現自己的BeanPostProcessor,Spring能自動注冊到容器中。

其中before方法是在bean實例化之后,屬性設置之后但在初始化方法之前執行;after方法是在各種初始化方法之后執行。

說到這里可能有人會想,這跟生命周期中的其它初始化接口有啥區別?其它的初始化方法也可以修改bean啊,這個問題問得好,那么我們來說下這個接口與InitializingBean Disposable接口以及自定義的init destroy方法的本質區別

  • bpp的兩個方法是有返回值Object的,這恰恰是問題的關鍵,這個bean就是我們要修改的bean,這樣一來,我們就可以修改bean實例本身,或替換,或wrap成一個proxy bean(Spring中的aop機制多是這么干),而其它的初始化接口的返回為void,因此它們理論上只能修改bean的狀態,能做的東西相當受限制。

  • bpp是以擴展插件的形式被Container執行,不需要bean本身去做什么(bean本身不用實現這個接口),所以這個插件跟bean在代碼上不耦合

  • 在執行方式上也完全不同,bpp是作為Spring container的一個擴展,在容器初始化bean的過程過,對每個bean都會執行一次,而初始化接口,由于是特定的bean實現的,所以與其它的bean無關,只對初始該類型的bean執行。簡而言之就是,雖然都是由容器執行對bean的操作,bpp是擴展的容器本身行為,而初始化接口是擴展bean的行為后被容器執行的。

在這里有兩種特殊的bpp不得不說,假設你需要自定義一個類似于@Autowire或者@Inject的注入功能的注解的時候(你可能會用到InjectionMetadata),普通的bpp可能就滿足不了你的需要了,你可能用到兩個特殊的bpp。

MergedBeanDefinitionPostProcessor(以下簡稱mbdpp)

InstantiationAwareBeanPostProcessor(以下簡稱iabpp)

他們都是繼承自bpp,但在spring bean 創建的過程中切入點不同于普通的bpp。

InstantiationAwareBeanPostProcessor接口

Spring bean中BeanPostProcessor怎么用

 看注釋

Spring bean中BeanPostProcessor怎么用

postProcessBeforeInstantiation方法

查閱AbstractAutowireCapableBeanFactory的createBean方法(這個方法是Spring容器創建bean的核心方法),可以看到,postProcessBeforeInstantiation是在bean實例化之前,postProcessAfterInstantiation是在實例化之后屬性設置以及autowire注入之前,它一般是spring框架內部使用,但在這里大有可為,用postProcessBeforeInstantiation可以生成代理對象( 一般作法是讓postProcessorBeforeInstantiation方法返回不為null,這樣就會中斷后續創建bean實例的過程,會以這個方法返回的對象作為bean實例),看源碼:

Spring bean中BeanPostProcessor怎么用

postProcessPropertyValues方法

用postProcessPropertyValues 可以完成對屬性的各種操作,注解中元數據的解析等,Spring的@Autowire注入,JSR330的@Inject以及JSR250的@Resource等注入操作都是通過這個方法完成。

這接口的用處在spring底層較多,有興趣的同學可以翻閱源碼,以下是兩個比較典型的實現。

AutowiredAnnotationBeanPostProcessor
AbstractAutoProxyCreator

MergedBeanDefinitionPostProcessor接口

Spring bean中BeanPostProcessor怎么用

這個接口傳入了一個RootBeanDefinition,這里允許我們修改bean的定義,@AutuwiredAnnotationBeanPostProcessor通過實現這個方法檢查并注冊需要注入的成員。

BeanFactoryPostProcessor(bfpp)

除了BeanPostProcessor還有一種想必大家都知道,那就是BeanFactoryPostProcessor

bfpp是作為beanFactory的一個很重要擴展插件,可以用來自定義BeanDefination的。它與bpp主要區別在于:

  • bpp是處理的bean實例,bfpp是處理bean的定義

  • bfpp能讀取和修改bean的定義(BeanDefination),比如說在配置中屬性值用到的占位符${}就是PropertyPlaceholderConfigurer通過實現bfpp來實現的

  • bpp處理的則是新鮮出爐并且設置好屬性的bean的實例(上邊提到iabpp和mdbpp的兩種特殊的bpp除外)

好了,說了這么多,來看下Spring創建bean的大致流程圖,這里只標出了比較關鍵的節點

 Spring bean中BeanPostProcessor怎么用

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Spring bean中BeanPostProcessor怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂托克前旗| 深圳市| 榕江县| 永新县| 通山县| 安丘市| 沈丘县| 来凤县| 长丰县| 江山市| 海安县| 广平县| 汶川县| 宜城市| 高陵县| 和林格尔县| 新晃| 永春县| 普宁市| 安泽县| 四平市| 乌拉特后旗| 濮阳县| 澄迈县| 广河县| 辽中县| 佳木斯市| 郴州市| 和静县| 佛教| 清涧县| 攀枝花市| 盐边县| 商丘市| 崇仁县| 农安县| 沾益县| 进贤县| 盐津县| 泾源县| 两当县|