亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一篇文章帶你玩轉(zhuǎn)Spring bean的終極利器

 更新時間:2018年05月06日 10:38:31   作者:張濤  
這篇文章主要給大家介紹了關(guān)于玩轉(zhuǎn)Spring bean的終極利器的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用spring bean具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

源碼,先睹為快

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

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

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

  • bpp的兩個方法是有返回值Object的,這恰恰是問題的關(guān)鍵,這個bean就是我們要修改的bean,這樣一來,我們就可以修改bean實例本身,或替換,或wrap成一個proxy bean(Spring中的aop機制多是這么干),而其它的初始化接口的返回為void,因此它們理論上只能修改bean的狀態(tài),能做的東西相當(dāng)受限制。
  • bpp是以擴展插件的形式被Container執(zhí)行,不需要bean本身去做什么(bean本身不用實現(xiàn)這個接口),所以這個插件跟bean在代碼上不耦合
  • 在執(zhí)行方式上也完全不同,bpp是作為Spring container的一個擴展,在容器初始化bean的過程過,對每個bean都會執(zhí)行一次,而初始化接口,由于是特定的bean實現(xiàn)的,所以與其它的bean無關(guān),只對初始該類型的bean執(zhí)行。簡而言之就是,雖然都是由容器執(zhí)行對bean的操作,bpp是擴展的容器本身行為,而初始化接口是擴展bean的行為后被容器執(zhí)行的。

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

MergedBeanDefinitionPostProcessor(以下簡稱mbdpp)

InstantiationAwareBeanPostProcessor(以下簡稱iabpp)

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

InstantiationAwareBeanPostProcessor接口

 看注釋


postProcessBeforeInstantiation方法

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

postProcessPropertyValues方法

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

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

AutowiredAnnotationBeanPostProcessor
AbstractAutoProxyCreator

MergedBeanDefinitionPostProcessor接口


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

BeanFactoryPostProcessor(bfpp)

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

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

  • bpp是處理的bean實例,bfpp是處理bean的定義
  • bfpp能讀取和修改bean的定義(BeanDefination),比如說在配置中屬性值用到的占位符${}就是PropertyPlaceholderConfigurer通過實現(xiàn)bfpp來實現(xiàn)的
  • bpp處理的則是新鮮出爐并且設(shè)置好屬性的bean的實例(上邊提到iabpp和mdbpp的兩種特殊的bpp除外)

好了,說了這么多,來看下Spring創(chuàng)建bean的大致流程圖,這里只標出了比較關(guān)鍵的節(jié)點

 

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • java根據(jù)模板導(dǎo)出PDF的詳細實現(xiàn)過程

    java根據(jù)模板導(dǎo)出PDF的詳細實現(xiàn)過程

    前段時間因為相關(guān)業(yè)務(wù)需求需要后臺生成pdf文件,所以下面這篇文章主要給大家介紹了關(guān)于java根據(jù)模板導(dǎo)出PDF的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • 通過Java添加Word文本框過程詳解

    通過Java添加Word文本框過程詳解

    這篇文章主要介紹了通過Java添加Word文本框過程詳解,在Word中,文本框是指一種可移動、可調(diào)節(jié)大小的文字或圖形容器。我們可以向文本框中添加文字、圖片、表格等對象,下面,將通過Java編程來實現(xiàn)添加以上對象到Word文本框,需要的朋友可以參考下
    2019-07-07
  • 使用java編程從0到1實現(xiàn)一個簡單計算器

    使用java編程從0到1實現(xiàn)一個簡單計算器

    這篇文章主要介紹了使用java編程從0到1實現(xiàn)一個簡單計算器,文章中用代碼實例講解的很清晰,有感興趣的同學(xué)可以學(xué)習(xí)研究下
    2021-02-02
  • 關(guān)于@Autowired的使用及注意事項

    關(guān)于@Autowired的使用及注意事項

    這篇文章主要介紹了關(guān)于@Autowired的使用及注意事項,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java實現(xiàn)兩臺服務(wù)器間文件復(fù)制的方法

    java實現(xiàn)兩臺服務(wù)器間文件復(fù)制的方法

    這篇文章主要介紹了java實現(xiàn)兩臺服務(wù)器間文件復(fù)制的方法,是對單臺服務(wù)器上文件復(fù)制功能的升級與改進,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • Java線程之間數(shù)據(jù)傳遞的實現(xiàn)示例(4種)

    Java線程之間數(shù)據(jù)傳遞的實現(xiàn)示例(4種)

    我們經(jīng)常會遇到父子線程數(shù)據(jù)傳遞(非調(diào)用參數(shù))的場景,本文主要介紹了Java線程之間數(shù)據(jù)傳遞的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • springboot詳解整合swagger方案

    springboot詳解整合swagger方案

    Swagger是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化?Restful?風(fēng)格的?Web?服務(wù)??傮w目標是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來更新。文件的方法、參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來始終保持同步
    2022-07-07
  • 深入理解LinkedHashSet集合的底層機制

    深入理解LinkedHashSet集合的底層機制

    這篇文章主要介紹了LinkedHashSet的底層機制詳解,LinkedHashSet根據(jù)元素的hashCode值來決定元素的存儲位置,同時使用鏈表維護元素的次序,?這使得元素看起來是以插入順序保存的,需要的朋友可以參考下
    2023-10-10
  • 在service層注入mapper時報空指針的解決

    在service層注入mapper時報空指針的解決

    這篇文章主要介紹了在service層注入mapper時報空指針的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring框架中的@Conditional系列注解詳解

    Spring框架中的@Conditional系列注解詳解

    這篇文章主要介紹了Spring框架中的@Conditional系列注解詳解,我們需要一個類實現(xiàn)Spring提供的Condition接口,它會匹配@Conditional所符合的方法,然后我們可以使用我們在@Conditional注解中定義的類來檢查,需要的朋友可以參考下
    2024-01-01

最新評論