国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - 一篇文章帶你玩轉Spring bean的終極利器

一篇文章帶你玩轉Spring bean的終極利器

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

這篇文章主要給大家介紹了關于玩轉Spring bean的終極利器的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring bean具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

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

源碼,先睹為快

一篇文章帶你玩轉Spring bean的終極利器

這個用法很簡單,它只有兩個方法,我們實現自己的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的終極利器

 看注釋

一篇文章帶你玩轉Spring bean的終極利器

postprocessbeforeinstantiation方法

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

一篇文章帶你玩轉Spring bean的終極利器

postprocesspropertyvalues方法

用postprocesspropertyvalues 可以完成對屬性的各種操作,注解中元數據的解析等,spring的@autowire注入,jsr330的@inject以及jsr250的@resource等注入操作都是通過這個方法完成。

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

autowiredannotationbeanpostprocessor
abstractautoproxycreator

mergedbeandefinitionpostprocessor接口

一篇文章帶你玩轉Spring bean的終極利器

這個接口傳入了一個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的終極利器

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩欧美国产精品 | 欧美日韩视频一区二区 | 午夜久久久 | 精品一区电影 | 国产欧美日韩一区 | 亚洲欧美视频 | 日日爽 | 亚洲精品国产第一综合99久久 | 精品国产免费看 | 成人瑟瑟 | 91精彩视频在线观看 | 91精品国产亚洲 | 最好的2019中文大全在线观看 | 黄色美女网站 | 日韩在线区 | 国产尤物一区 | 久久久免费电影 | 日韩欧美一区二区三区免费观看 | 亚洲精品久久久一区二区三区 | 在线观看精品91福利 | 日日夜夜av | 久久一二区 | 久久精品国产一区二区电影 | 亚洲一区二区在线看 | 国产成人欧美一区二区三区的 | 中文字幕一区二区三区四区五区 | 欧美日韩不卡视频 | 国产精品精品 | 在线观看特色大片免费网站 | 91久久精品国产亚洲a∨麻豆 | av网站一区| 日韩精品一区二区在线观看 | 国产欧美综合一区二区三区 | 欧美一区二区在线播放 | 一级在线| 午夜视频在线观看网站 | 亚洲视频免费 | 亚洲高清视频在线 | 国产啊女在线观看 | 精品久久网 | 国产高清av在线一区二区三区 |