一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語(yǔ)言|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 一篇文章帶你玩轉(zhuǎn)Spring bean的終極利器

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

2021-04-26 14:31張濤 Java教程

這篇文章主要給大家介紹了關(guān)于玩轉(zhuǎn)Spring bean的終極利器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring bean具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

源碼,先睹為快

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

這個(gè)用法很簡(jiǎn)單,它只有兩個(gè)方法,我們實(shí)現(xiàn)自己的beanpostprocessor,spring能自動(dòng)注冊(cè)到容器中。

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

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

  • bpp的兩個(gè)方法是有返回值object的,這恰恰是問(wèn)題的關(guān)鍵,這個(gè)bean就是我們要修改的bean,這樣一來(lái),我們就可以修改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的過(guò)程過(guò),對(duì)每個(gè)bean都會(huì)執(zhí)行一次,而初始化接口,由于是特定的bean實(shí)現(xiàn)的,所以與其它的bean無(wú)關(guān),只對(duì)初始該類(lèi)型的bean執(zhí)行。簡(jiǎn)而言之就是,雖然都是由容器執(zhí)行對(duì)bean的操作,bpp是擴(kuò)展的容器本身行為,而初始化接口是擴(kuò)展bean的行為后被容器執(zhí)行的。

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

mergedbeandefinitionpostprocessor(以下簡(jiǎn)稱(chēng)mbdpp)

instantiationawarebeanpostprocessor(以下簡(jiǎn)稱(chēng)iabpp)

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

instantiationawarebeanpostprocessor接口

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

 看注釋

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

postprocessbeforeinstantiation方法

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

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

postprocesspropertyvalues方法

用postprocesspropertyvalues 可以完成對(duì)屬性的各種操作,注解中元數(shù)據(jù)的解析等,spring的@autowire注入,jsr330的@inject以及jsr250的@resource等注入操作都是通過(guò)這個(gè)方法完成。

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

autowiredannotationbeanpostprocessor
abstractautoproxycreator

mergedbeandefinitionpostprocessor接口

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

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

beanfactorypostprocessor(bfpp)

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

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

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

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

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

總結(jié)

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

原文鏈接:https://mp.weixin.qq.com/s/29EaSBRGeCofO94tQOn_JA

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品欧美日韩一区二区 | 国产精品久久久久久久久齐齐 | 99久久99久久久精品齐齐鬼色 | 成年女人毛片免费观看中文w | 丰腴尤物贵妇浪荡小说 | 草莓社区| 欧美又大又粗又长又硬 | 毛片一级毛片 | chinese帅男gayvideo| 高清在线一区二区 | 国产精品亚洲精品观看不卡 | 国产精品拍拍拍福利在线观看 | 91精品国产91久久久久 | 男人操美女视频 | 色偷偷91久久综合噜噜噜 | 精品精品国产自在久久高清 | 无人区1在线观看 | 欧美免赞性视频 | 91庥豆果冻天美精东蜜桃传媒 | 免费一级欧美片片线观看 | 强行扒开美女大腿挺进 | 四虎影院com| 色倩网站 | 日本96在线精品视频免费观看 | 图片一区| 校花被吃奶还摸下面 | 久久亚洲精选 | 亚洲天堂成人在线 | 动漫美女被吸乳羞羞小说 | www.尤物| 成年性生交大片免费看 | 四虎影视国产精品婷婷 | 午夜影院免费体验 | a级亚洲片精品久久久久久久 | 国产精品高清视亚洲一区二区 | 99久久这里只有精品 | 性欧美video 性满足久久久久久久久 | 国产精品久久毛片完整版 | 欧美一级v片 | 免费日批视频 | 亚洲精品第三页 |