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

Spring注解驅(qū)動(dòng)之BeanDefinitionRegistryPostProcessor原理解析

 更新時(shí)間:2022年09月30日 09:29:16   作者:融極  
這篇文章主要介紹了Spring注解驅(qū)動(dòng)之BeanDefinitionRegistryPostProcessor原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

BeanDefinitionRegistryPostProcessor概述

可以看到BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口。

注釋中說(shuō)執(zhí)行時(shí)機(jī)是所有合法的bean定義已經(jīng)加載,但是還沒(méi)實(shí)例化。

看起來(lái)和BeanFactoryPostProcessor執(zhí)行時(shí)機(jī)差不多,但是BeanFactoryPostProcessor的注釋是所有bean定義被加載,而B(niǎo)eanDefinitionRegistryPostProcessor是所有合法的bean定義。

接著看注釋?zhuān)?/strong>

This allows for adding further bean definitions before the next post-processing phase kicks in.

意思是BeanDefinitionRegistryPostProcessor允許添加將來(lái)的bean定義在下一個(gè)后置處理器階段開(kāi)始之前。簡(jiǎn)單說(shuō)就是還可以往容器中增加新的bean的定義。

因此,大概率BeanDefinitionRegistryPostProcessor的執(zhí)行順序在BeanFactoryPostProcessor之前。

案例實(shí)踐

首先,編寫(xiě)一個(gè)類(lèi),例如MyBeanDefinitionRegistryPostProcessor,它應(yīng)要實(shí)現(xiàn)BeanDefinitionRegistryPostProcessor這個(gè)接口。

package com.meimeixia.ext;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.stereotype.Component;

import com.meimeixia.bean.Blue;

// 記住,我們這個(gè)組件寫(xiě)完之后,一定別忘了給它加在容器中
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("MyBeanDefinitionRegistryPostProcessor...bean的數(shù)量:" + beanFactory.getBeanDefinitionCount());
	}

	/**
	 * 這個(gè)BeanDefinitionRegistry就是Bean定義信息的保存中心,這個(gè)注冊(cè)中心里面存儲(chǔ)了所有的bean定義信息,
	 * 以后,BeanFactory就是按照BeanDefinitionRegistry里面保存的每一個(gè)bean定義信息來(lái)創(chuàng)建bean實(shí)例的。
	 * 
	 * bean定義信息包括有哪些呢?有這些,這個(gè)bean是單例的還是多例的、bean的類(lèi)型是什么以及bean的id是什么。
	 * 也就是說(shuō),這些信息都是存在BeanDefinitionRegistry里面的。
	 */
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("postProcessBeanDefinitionRegistry...bean的數(shù)量:" + registry.getBeanDefinitionCount());
		// 除了查看bean的數(shù)量之外,我們還可以給容器里面注冊(cè)一些bean,我們以前也簡(jiǎn)單地用過(guò)
		/*
		 * 第一個(gè)參數(shù):我們將要給容器中注冊(cè)的bean的名字
		 * 第二個(gè)參數(shù):BeanDefinition對(duì)象
		 */
		// RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class); // 現(xiàn)在我準(zhǔn)備給容器中添加一個(gè)Blue對(duì)象
		// 咱們也可以用另外一種辦法,即使用BeanDefinitionBuilder這個(gè)構(gòu)建器生成一個(gè)BeanDefinition對(duì)象,很顯然,這兩種方法的效果都是一樣的
		AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition();
		registry.registerBeanDefinition("hello", beanDefinition);
	}
}

測(cè)試結(jié)果

可以看到,BeanDefinitionRegistryPostProcessor里面的兩個(gè)方法,postProcessBeanDefinitionRegistry在postProcessBeanFactory之前執(zhí)行。

BeanDefinitionRegistryPostProcessor比BeanFactoryPostProcessor先執(zhí)行。

源碼分析

自己在測(cè)試示例中方法打斷點(diǎn),然后查看調(diào)用棧即可,下面是一些主要的代碼片段。

繼續(xù)向下看,可以看到會(huì)取出所有實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor接口的類(lèi),即從容器中獲取到所有的BeanDefinitionRegistryPostProcessor組件。

然后,優(yōu)先調(diào)用實(shí)現(xiàn)了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor組件。

點(diǎn)進(jìn)去這個(gè)方法里面一看究竟,原來(lái)是先調(diào)用完BeanDefinitionRegistryPostProcessor組件里面的postProcessBeanDefinitionRegistry方法,然后再來(lái)調(diào)用它里面的postProcessBeanFactory方法。

我們?cè)賮?lái)仔細(xì)看一下PostProcessorRegistrationDelegate類(lèi)中的invokeBeanFactoryPostProcessors方法,只不過(guò)這時(shí)是從程序停留的地方(即第122行代碼處)往下看,如下圖所示。

小結(jié)

BeanDefinitionRegistryPostProcessor的執(zhí)行流程。

1. 創(chuàng)建IOC容器。

2. 調(diào)用refresh方法。

3. 從IOC容器中獲取所有的BeanDefinitionRegistryPostProcessor組件,并依次觸發(fā)它們的postProcessBeanDefinitionRegistry方法,之后觸發(fā)它的postProcessBeanFactory方法。

4. 從IOC容器中獲取到所有的BeanFactoryPostProcessor組件,并依次觸發(fā)它們的postProcessBeanFactory方法。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MybatisPlus如何自動(dòng)生成映射文件

    MybatisPlus如何自動(dòng)生成映射文件

    這篇文章主要介紹了MybatisPlus如何自動(dòng)生成映射文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置詳解

    Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置詳解

    任務(wù)調(diào)度是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)碰到的,下面這篇文章主要給大家介紹了關(guān)于Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐

    SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐

    Druid連接池作為一款強(qiáng)大的數(shù)據(jù)庫(kù)連接池,提供了豐富的監(jiān)控和管理功能,成為很多Java項(xiàng)目的首選,本文主要介紹了SpringBoot3整合Druid監(jiān)控功能的項(xiàng)目實(shí)踐,感興趣的可以了解一下
    2024-01-01
  • Java棋類(lèi)游戲?qū)嵺`之中國(guó)象棋

    Java棋類(lèi)游戲?qū)嵺`之中國(guó)象棋

    這篇文章主要為大家詳細(xì)介紹了Java棋類(lèi)游戲中的中國(guó)象棋實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • java本機(jī)內(nèi)存分配N(xiāo)ative?memory?allocation?mmap失敗問(wèn)題解決

    java本機(jī)內(nèi)存分配N(xiāo)ative?memory?allocation?mmap失敗問(wèn)題解決

    這篇文章主要介紹了java本機(jī)內(nèi)存分配N(xiāo)ative?memory?allocation?mmap失敗問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • SpringBoot?熱搜與不雅文字過(guò)濾的實(shí)現(xiàn)

    SpringBoot?熱搜與不雅文字過(guò)濾的實(shí)現(xiàn)

    本文主要介紹了SpringBoot?熱搜與不雅文字過(guò)濾的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯

    關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯

    Log4j?是Apache為Java提供的日志管理工具。他與System.out.println()的作用相似,用來(lái)跟蹤、調(diào)試、維護(hù)程序。這篇文章主要介紹了關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯,需要的朋友可以參考下
    2021-12-12
  • java 中cookie的詳解及簡(jiǎn)單實(shí)例

    java 中cookie的詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了java 中cookie的詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,這里對(duì)cookie 的建立與讀取,和設(shè)定cookie 生命周期等詳細(xì)介紹,需要的朋友可以參考下
    2017-01-01
  • Java基本概念監(jiān)視器實(shí)習(xí)原理解析

    Java基本概念監(jiān)視器實(shí)習(xí)原理解析

    這篇文章主要介紹了Java基本概念監(jiān)視器實(shí)習(xí)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Springboot項(xiàng)目?jī)?yōu)雅地處理日志的方法詳解

    Springboot項(xiàng)目?jī)?yōu)雅地處理日志的方法詳解

    這篇文章主要介紹了Springboot項(xiàng)目---優(yōu)雅地處理日志,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

东丽区| 望城县| 塘沽区| 郴州市| 冀州市| 景洪市| 远安县| 洞口县| 湖北省| 平武县| 青田县| 虹口区| 定日县| 麻江县| 彭泽县| 昭苏县| 紫云| 彝良县| 察隅县| 洞口县| 深泽县| 新河县| 奉节县| 磐石市| 长沙县| 隆化县| 铜梁县| 井冈山市| 嵊州市| 晴隆县| 新沂市| 宿州市| 淮南市| 玛曲县| 阜南县| 连云港市| 镇平县| 东源县| 新和县| 于都县| 江门市|