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

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

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

BeanDefinitionRegistryPostProcessor概述

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

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

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

接著看注釋:

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

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

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

案例實(shí)踐

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

測試結(jié)果

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

BeanDefinitionRegistryPostProcessor比BeanFactoryPostProcessor先執(zhí)行。

源碼分析

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

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

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

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

我們再來仔細(xì)看一下PostProcessorRegistrationDelegate類中的invokeBeanFactoryPostProcessors方法,只不過這時(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)文章

  • RabbitMQ消息有效期與死信的處理過程

    RabbitMQ消息有效期與死信的處理過程

    利用DLX,當(dāng)消息在一個(gè)隊(duì)列中變成死信?(dead?message)?之后,它能被重新publish到另一個(gè)Exchange,這個(gè)Exchange就是DLX,本文重點(diǎn)給大家介紹RabbitMQ消息有效期與死信的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • 測量Java對象所占內(nèi)存大小方式

    測量Java對象所占內(nèi)存大小方式

    這篇文章主要介紹了測量Java對象所占內(nèi)存大小方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Freemarker 最簡單的例子程序

    Freemarker 最簡單的例子程序

    Freemarker最簡單的例子程序是通過String來創(chuàng)建模版對象,并執(zhí)行插值處理。
    2016-04-04
  • 面向切面的Spring通過切點(diǎn)來選擇連接點(diǎn)實(shí)例詳解

    面向切面的Spring通過切點(diǎn)來選擇連接點(diǎn)實(shí)例詳解

    這篇文章主要為大家介紹了面向切面的Spring通過切點(diǎn)來選擇連接點(diǎn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • springboot如何讀取配置文件(application.yml)中的屬性值

    springboot如何讀取配置文件(application.yml)中的屬性值

    本篇文章主要介紹了springboot如何讀取配置文件(application.yml)中的屬性值,具有一定的參考價(jià)值,有興趣的小伙伴可以了解一下
    2017-04-04
  • Spring Boot集成Spring Cache過程詳解

    Spring Boot集成Spring Cache過程詳解

    這篇文章主要介紹了Spring Boot集成Spring Cache過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java實(shí)現(xiàn)掃雷游戲詳細(xì)代碼講解

    Java實(shí)現(xiàn)掃雷游戲詳細(xì)代碼講解

    windows自帶的游戲《掃雷》是陪伴了無數(shù)人的經(jīng)典游戲,本文將利用Java語言實(shí)現(xiàn)這一經(jīng)典的游戲,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Java SpringBoot容器注入對象詳解

    Java SpringBoot容器注入對象詳解

    本文通過實(shí)例代碼給大家詳解了springboot獲取ioc容器中注入的bean問題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • json解析時(shí)遇到英文雙引號報(bào)錯(cuò)的解決方法

    json解析時(shí)遇到英文雙引號報(bào)錯(cuò)的解決方法

    下面小編就為大家分享一篇json解析時(shí)遇到英文雙引號報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Java線程讓步y(tǒng)ield用法實(shí)例分析

    Java線程讓步y(tǒng)ield用法實(shí)例分析

    這篇文章主要介紹了Java線程讓步y(tǒng)ield用法,結(jié)合實(shí)例形式分析了java中yield()方法的功能、原理及線程讓步操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-09-09

最新評論