最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

源碼,先睹為快

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

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

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

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

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

MergedBeanDefinitionPostProcessor(以下簡稱mbdpp)

InstantiationAwareBeanPostProcessor(以下簡稱iabpp)

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

InstantiationAwareBeanPostProcessor接口

 看注釋


postProcessBeforeInstantiation方法

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

postProcessPropertyValues方法

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

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

AutowiredAnnotationBeanPostProcessor
AbstractAutoProxyCreator

MergedBeanDefinitionPostProcessor接口


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

BeanFactoryPostProcessor(bfpp)

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

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

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

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

 

總結(jié)

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

相關(guān)文章

  • Java算法實(shí)現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解

    Java算法實(shí)現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解

    今天小編就為大家分享一篇關(guān)于Java算法實(shí)現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Spring Cloud Feign內(nèi)部實(shí)現(xiàn)代碼細(xì)節(jié)

    Spring Cloud Feign內(nèi)部實(shí)現(xiàn)代碼細(xì)節(jié)

    Feign 的英文表意為“假裝,偽裝,變形”, 是一個(gè)http請求調(diào)用的輕量級框架,可以以Java接口注解的方式調(diào)用Http請求,而不用像Java中通過封裝HTTP請求報(bào)文的方式直接調(diào)用。接下來通過本文給大家分享Spring Cloud Feign內(nèi)部實(shí)現(xiàn)代碼細(xì)節(jié),感興趣的朋友一起看看吧
    2021-05-05
  • spring-cloud Sleuth的使用方法

    spring-cloud Sleuth的使用方法

    這篇文章主要介紹了spring-cloud Sleuth的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Java-性能分析和監(jiān)控工具深入詳解

    Java-性能分析和監(jiān)控工具深入詳解

    這篇文章主要介紹了Java-性能分析和監(jiān)控工具深入詳解,文章內(nèi)容詳細(xì),簡單易懂,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2023-01-01
  • 使用JMF實(shí)現(xiàn)java視頻播放器

    使用JMF實(shí)現(xiàn)java視頻播放器

    這篇文章主要為大家詳細(xì)介紹了使用JMF實(shí)現(xiàn)java視頻播放器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java JDBC連接Kerberos認(rèn)證的HIVE和Impala方式

    Java JDBC連接Kerberos認(rèn)證的HIVE和Impala方式

    本文主要介紹了HiveJDBC和ImpalaJDBC的使用方法,包括版本對應(yīng)、Maven安裝、主機(jī)名配置、端口開通、JDBC連接和Kerberos認(rèn)證等
    2025-02-02
  • Java必備知識之位運(yùn)算及常見進(jìn)制解讀

    Java必備知識之位運(yùn)算及常見進(jìn)制解讀

    從現(xiàn)代計(jì)算機(jī)中所有的數(shù)據(jù)二進(jìn)制的形式存儲在設(shè)備中。即 0、1 兩種狀態(tài),計(jì)算機(jī)對二進(jìn)制數(shù)據(jù)進(jìn)行的運(yùn)算(+、-、*、/)都是叫位運(yùn)算,即將符號位共同參與運(yùn)算的運(yùn)算
    2021-10-10
  • Java加載資源文件時(shí)的路徑問題的解決辦法

    Java加載資源文件時(shí)的路徑問題的解決辦法

    今天偶然看到一篇關(guān)于tomcat加載servlet的文章,不由得想起了java加載資源文件的路徑問題,資源文件可以使xml,properties,圖片等,可以是任何文件
    2013-04-04
  • Java中Queue的poll()和remove()區(qū)別詳解

    Java中Queue的poll()和remove()區(qū)別詳解

    這篇文章主要介紹了Java中Queue的poll()和remove()區(qū)別詳解,Queue接口提供了許多方法,其中poll()和remove()是兩個(gè)常用的方法,它們的區(qū)別在于,當(dāng)隊(duì)列為空時(shí),poll()方法返回null,而remove()方法會拋出,需要的朋友可以參考下
    2023-07-07
  • SpringBoot起步依賴和自動配置基本介紹

    SpringBoot起步依賴和自動配置基本介紹

    這篇文章主要介紹了SpringBoot起步依賴和自動配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04

最新評論

喜德县| 铁岭县| 全州县| 三河市| 银川市| 嵊泗县| 馆陶县| 韶山市| 寿阳县| 绥宁县| 博湖县| 宜阳县| 兰州市| 巨鹿县| 上虞市| 曲麻莱县| 田阳县| 榆树市| 桐庐县| 金寨县| 泰州市| 湘潭市| 阿鲁科尔沁旗| 金堂县| 化州市| 永城市| 武定县| 界首市| 宽城| 卢氏县| 缙云县| 澄江县| 磐安县| 绵竹市| 玉田县| 宁海县| 美姑县| 南郑县| 阿克陶县| 平武县| 荔浦县|