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

Spring注解驅(qū)動之BeanFactoryPostProcessor原理解析

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

概述

我們現(xiàn)在來學(xué)習(xí)一下Spring里面的一些擴展原理,希望大家通過這些原理的學(xué)習(xí),對Spring里面的運行機制,包括其內(nèi)部的工作原理,能有一個非常深刻的認(rèn)識,為以后學(xué)習(xí)Spring里面的其他框架會有較大的幫助。

BeanFactoryPostProcessor的調(diào)用時機

BeanFactoryPostProcessor其實就是BeanFactory(創(chuàng)建bean的工廠)的后置處理器。

看到BeanFactoryPostProcessor會聯(lián)想到BeanPostProcessor,之前說過它是bean的后置處理器,并且是在bean創(chuàng)建對象初始化前后進行攔截工作的。

看完接口上的描述后,我們可以指定BeanFactoryPostProcessor的調(diào)用時機。意思是在IOC容器的BeanFactory標(biāo)準(zhǔn)初始化完成之后,修改IOC容器里面的BeanFactory。

什么是標(biāo)準(zhǔn)初始化么?后面描述是所有的bean定義已經(jīng)被加載了,但是還沒有bean被初始化。

總結(jié):BeanFactoryPostProcessor的調(diào)用時機是在BeanFactory標(biāo)準(zhǔn)化之后,我們可以定制、修改BeanFactory里面的一些內(nèi)容,此時,所有的bean定義已經(jīng)被加載到BeanFactory中了,但是bean的實例還沒創(chuàng)建。

案例實踐

首先編寫一個類實現(xiàn)BeanFactoryPostProcessor接口。

package com.meimeixia.ext;
import java.util.Arrays;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		System.out.println("MyBeanFactoryPostProcessor...postProcessBeanFactory..."); // 這個時候我們所有的bean還沒被創(chuàng)建
		                                                                              // 但是我們可以看一下通過Spring給我們傳過來的這個beanFactory,我們能拿到什么
		int count = beanFactory.getBeanDefinitionCount(); // 我們能拿到有幾個bean定義
		String[] names = beanFactory.getBeanDefinitionNames(); // 除此之外,我們還能拿到每一個bean定義的名字
		System.out.println("當(dāng)前BeanFactory中有" + count + "個Bean");
		System.out.println(Arrays.asList(names));
	}
}

注意,我們自己編寫的MyBeanFactoryPostProcessor類要想讓Spring知道,并且還要能被使用起來,那么它一定就得被加到容器中,為此,我們可以在其上標(biāo)注一個@Component注解。

然后創(chuàng)建一個配置類,例如ExtConfig,在該配置類上使用@ComponentScan注解來配置包掃描。

package com.meimeixia.ext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.meimeixia.bean.Blue;

@ComponentScan("com.meimeixia.ext")
@Configuration
public class ExtConfig {
	@Bean
	public Blue blue() {
		return new Blue();
	}	
}

package com.meimeixia.bean;

public class Blue {

	public Blue() {
		System.out.println("blue...constructor");
	}
	
	public void init() {
		System.out.println("blue...init...");
	}
	
	public void destory() {
		System.out.println("blue...destory...");
	}
}

編寫測試類

package com.meimeixia.test;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.meimeixia.ext.ExtConfig;

public class IOCTest_Ext {
	
	@Test
	public void test01() {
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
		// 關(guān)閉容器
		applicationContext.close();
	}
}

接下來測試下BeanFactoryPostProcessor的調(diào)用時機。

我們看到自己編寫的BeanFactoryPostProcessor在Blue類的無參構(gòu)造器創(chuàng)建Blue對象之前就已經(jīng)工作了。我們看看到Blue組件注冊到容器中的名字,只是此刻還沒有創(chuàng)建對象。

說明BeanFactoryPostProcessor是在所有的bean定義信息都被加載之后才調(diào)用的。

源碼分析

鼠標(biāo)單擊Eclipse左上角方法調(diào)用棧中的IOCTest_Ext.test01() line:12,這時程序來到了IOCTest_Ext類的test01方法中,如下圖所示。

繼續(xù)跟進代碼,可以看到創(chuàng)建IOC容器時,最后還得刷新容器,如下圖所示。

繼續(xù)跟進代碼,可以看到在刷新容器的過程中,還得執(zhí)行在容器中注冊的BeanFactoryPostProcessor(BeanFactory的后置處理器)的方法。

那具體是怎么來執(zhí)行BeanFactoryPostProcessor的呢?我們繼續(xù)跟進代碼,發(fā)現(xiàn)又調(diào)用了一個invokeBeanFactoryPostProcessors方法,如下圖所示。

下面我們來仔細(xì)分析一下PostProcessorRegistrationDelegate類中的invokeBeanFactoryPostProcessors方法具體都做了哪些操作。

會發(fā)現(xiàn)其遍歷了所有的BeanFactoryPostProcessor組件,我們自己編寫的實現(xiàn)了BeanFactoryPostProcessor接口的MyBeanFactoryPostProcessor類肯定也屬于其中,所以會被遍歷到,然后便會執(zhí)行其postProcessBeanFactory方法。

小結(jié)

經(jīng)過源碼分析,我們可以得出這樣一個結(jié)論:首先從IOC容器中找到所有類型是BeanFactoryPostProcessor的組件,然后再來執(zhí)行它們其中的方法,而且是在初始化創(chuàng)建其他組件前面執(zhí)行。

為什么在初始化其他組件前面執(zhí)行的呢,之前我們分析AOP原理是,bean的初始化是放在finishBeanFactoryInitialization(beanFactory)方法執(zhí)行的。

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

相關(guān)文章

  • SpringMVC實現(xiàn)文件上傳下載的全過程

    SpringMVC實現(xiàn)文件上傳下載的全過程

    對于上傳功能,我們在項目中是經(jīng)常會用到的,比如用戶注冊的時候,上傳用戶頭像,這個時候就會使用到上傳的功能,而對于下載使用場景也很常見,下面這篇文章主要給大家介紹了關(guān)于SpringMVC實現(xiàn)文件上傳下載的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • mybatis-plus的sql加載順序源碼解析

    mybatis-plus的sql加載順序源碼解析

    這篇文章主要為大家介紹了mybatis-plus的sql加載順序源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • SpringBoot入門教程詳解

    SpringBoot入門教程詳解

    SpringBoot?是由?Pivotal?團隊提供的全新框架,其設(shè)計目的是用來簡化?Spring?應(yīng)用的初始搭建以及開發(fā)過程。本文將詳細(xì)為大家講講SpringBoot是使用,需要的可以參考一下
    2022-06-06
  • Java編程利用socket多線程訪問服務(wù)器文件代碼示例

    Java編程利用socket多線程訪問服務(wù)器文件代碼示例

    這篇文章主要介紹了Java編程利用socket多線程訪問服務(wù)器文件代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Spring Boot和Vue跨域請求問題原理解析

    Spring Boot和Vue跨域請求問題原理解析

    這篇文章主要介紹了Spring Boot和Vue跨域請求問題原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java判斷字符串中是否包含中文方法

    Java判斷字符串中是否包含中文方法

    這篇文章主要介紹了Java判斷字符串中是否包含中文方法,使用Matcher類解決了這個問題,需要的朋友可以參考下
    2014-06-06
  • Spring boot集成swagger2生成接口文檔的全過程

    Spring boot集成swagger2生成接口文檔的全過程

    這篇文章主要給大家介紹了關(guān)于Spring boot集成swagger2生成接口文檔的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之并查集的實現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之并查集的實現(xiàn)

    并查集是一種用來管理元素分組情況的數(shù)據(jù)結(jié)構(gòu)。并查集可以高效地進行如下操作。本文將通過Java實現(xiàn)并查集,感興趣的小伙伴可以了解一下
    2022-01-01
  • Java排序的那些事之sort方法的使用詳解

    Java排序的那些事之sort方法的使用詳解

    sort方法用于對數(shù)組的元素進行排序。排序順序可以是字母或數(shù)字,并按升序或降序。默認(rèn)排序順序為按字母升序,當(dāng)數(shù)字是按字母順序排列時"40"將排在"5"前面。使用數(shù)字排序,你必須通過一個函數(shù)作為參數(shù)來調(diào)用。這些說起來可能很難理解,你可以通過本篇文章進一步了解它
    2021-09-09
  • Hibernate初體驗及簡單錯誤排除代碼詳解

    Hibernate初體驗及簡單錯誤排除代碼詳解

    這篇文章主要介紹了Hibernate初體驗及簡單錯誤排除代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02

最新評論

灵宝市| 峨山| 苍梧县| 登封市| 峨眉山市| 博乐市| 新田县| 沂源县| 池州市| 喀喇沁旗| 神木县| 扎兰屯市| 平原县| 大新县| 九寨沟县| 尉氏县| 资兴市| 历史| 榆树市| 长岭县| 茂名市| 武平县| 茶陵县| 南溪县| 崇州市| 肇庆市| 乐清市| 泸州市| 嘉祥县| 麟游县| 普格县| 石台县| 阿拉善左旗| 新和县| 南康市| 宣化县| 加查县| 石棉县| 姜堰市| 崇文区| 普宁市|