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

Spring 中 BeanFactoryPostProcessor 的作用和示例源碼分析

 更新時間:2025年03月18日 11:08:17   作者:xiaolingting  
Spring的BeanFactoryPostProcessor是容器初始化的擴展接口,允許在Bean實例化前修改或擴展Bean的配置元數(shù)據(jù),本文給大家介紹Spring 中 BeanFactoryPostProcessor 的作用和示例源碼分析,感興趣的朋友一起看看吧

一、概覽

1. 核心定位

BeanFactoryPostProcessor 是 Spring 容器級別的擴展接口,在 Bean 實例化之前,對 Bean 的配置元數(shù)據(jù)(即 BeanDefinition)進行動態(tài)修改或擴展。其核心功能圍繞以下兩點:

  • 修改現(xiàn)有 Bean 的定義(如屬性值、作用域、初始化方法等)。
  • 添加新的 Bean 定義(需通過子接口 BeanDefinitionRegistryPostProcessor)。

2. 核心功能詳解

功能場景與示例
動態(tài)調整 Bean 配置修改屬性值(如占位符替換)、調整作用域(單例改原型)、覆蓋懶加載設置等。
例:PropertySourcesPlaceholderConfigurer 解析 ${} 占位符。
注冊新 Bean 定義通過子接口 BeanDefinitionRegistryPostProcessor 動態(tài)注冊新 Bean(如根據(jù)條件加載不同實現(xiàn)類)。
全局性配置處理批量修改所有 Bean 的公共屬性(如統(tǒng)一設置緩存超時時間)。
與外部配置集成結合環(huán)境變量或遠程配置中心,動態(tài)覆蓋 Bean 的初始配置(如數(shù)據(jù)庫連接參數(shù)動態(tài)更新)。
擴展容器能力注冊自定義作用域(如線程級別作用域)、實現(xiàn)模塊化配置加載(如插件化架構中的模塊注冊)。

3. 關鍵特性

  • 執(zhí)行時機:在 BeanDefinition 加載完成之后、Bean 實例化之前(即 refresh() 方法中的 invokeBeanFactoryPostProcessors 階段)。
  • 作用對象:操作對象是 BeanDefinition(配置元數(shù)據(jù)),而非 Bean 實例,避免過早實例化導致性能問題。
  • 擴展層級
    • 直接實現(xiàn)BeanFactoryPostProcessor 用于修改現(xiàn)有配置。
    • 子接口擴展BeanDefinitionRegistryPostProcessor 支持新增/刪除 BeanDefinition,且執(zhí)行更早。
  • 執(zhí)行順序
    • 所有 BeanDefinitionRegistryPostProcessor(優(yōu)先處理 PriorityOrdered,再 Ordered,最后普通實現(xiàn))。
    • 所有 BeanFactoryPostProcessor(同上優(yōu)先級順序)。

二、Spring 內置的 BeanFactoryPostProcessor

1. ConfigurationClassPostProcessor

  • 作用:解析 @Configuration 類、@ComponentScan、@Import 等注解,注冊相關 BeanDefinition
  • 實現(xiàn)接口:BeanDefinitionRegistryPostProcessor。
  • 優(yōu)先級:PriorityOrdered(最高)。
  • 源碼關鍵邏輯:
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
    processConfigBeanDefinitions(registry); // 掃描并注冊配置類中的 Bean
}

2. PropertySourcesPlaceholderConfigurer

  • 作用:解析 BeanDefinition 中的占位符(如 ${jdbc.url}),替換為 Environment 中的實際值。
  • 實現(xiàn)接口BeanFactoryPostProcessor
  • 源碼關鍵邏輯
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    processProperties(beanFactory); // 替換占位符
}

3. EventListenerMethodProcessor

  • 作用:掃描 @EventListener 注解,將方法包裝為 ApplicationListener 并注冊到容器。
  • 實現(xiàn)接口BeanFactoryPostProcessor。
  • 觸發(fā)時機BeanFactoryPostProcessor 階段注冊監(jiān)聽器。

4. CustomScopeConfigurer

  • 作用:注冊自定義作用域(如 request、session)。
  • 實現(xiàn)接口BeanFactoryPostProcessor
  • 示例
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    beanFactory.registerScope("thread", new SimpleThreadScope());
}

三、用戶自定義的 BeanFactoryPostProcessor

1. 動態(tài)修改 BeanDefinition

public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        BeanDefinition beanDef = beanFactory.getBeanDefinition("user");
        beanDef.getPropertyValues().add("name", "xiaolingting");
    }
}

2. 注冊外部配置客戶端

public class ConfigClientPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
        // 注冊遠程配置中心客戶端
        registry.registerBeanDefinition("configClient", new RootBeanDefinition(ConfigClient.class));
    }
}

四、執(zhí)行流程與源碼分析

1. 核心入口方法

AbstractApplicationContext#refresh() 中調用:

invokeBeanFactoryPostProcessors(beanFactory);

2. 處理順序邏輯

步驟 1:處理 BeanDefinitionRegistryPostProcessor 實現(xiàn)類:

// 獲取所有實現(xiàn)類并按優(yōu)先級排序
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class);
for (String ppName : postProcessorNames) {
    if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
        priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    }
    // 其他優(yōu)先級處理...
}

步驟 2:處理 BeanFactoryPostProcessor 實現(xiàn)類:

// 按優(yōu)先級分組調用
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

3. 典型場景示例

  • 配置類掃描:ConfigurationClassPostProcessor 在 postProcessBeanDefinitionRegistry 階段掃描 @Component 并注冊 Bean。
  • 占位符替換:PropertySourcesPlaceholderConfigurer 在 postProcessBeanFactory 階段替換屬性值。

五、設計意義與最佳實踐

  • 擴展性:通過組合模式而非繼承,靈活擴展 Spring 容器。
  • 性能優(yōu)化:在 Bean 實例化前修改元數(shù)據(jù),避免重復初始化開銷。
  • 應用場景:
    • 動態(tài)配置:根據(jù)環(huán)境變量調整 Bean 屬性。
    • 插件化架構:運行時注冊新組件(如數(shù)據(jù)庫驅動)。
    • AOP 前置處理:注冊代理相關的 BeanPostProcessor。

總結:Spring 的 BeanFactoryPostProcessor 是容器初始化的核心擴展點,通過內置和自定義實現(xiàn),開發(fā)者可在不同階段精確控制 Bean 的元數(shù)據(jù)和行為,為復雜應用提供強大的底層支持。

附:源碼

到此這篇關于Spring 中 BeanFactoryPostProcessor 的作用和示例的文章就介紹到這了,更多相關Spring BeanFactoryPostProcessor內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot3 + Sa-Token 雙Token登錄認證實戰(zhàn)案例解析

    SpringBoot3 + Sa-Token 雙Token登錄認證實戰(zhàn)案例解析

    本文詳細介紹了如何在SpringBoot3項目中使用Sa-Token框架實現(xiàn)雙Token登錄認證,全面展示了雙Token登錄認證的實現(xiàn)過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-02-02
  • java實現(xiàn)網(wǎng)頁驗證碼功能

    java實現(xiàn)網(wǎng)頁驗證碼功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)網(wǎng)頁驗證碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • KotlinScript構建SpringBootStarter保姆級教程

    KotlinScript構建SpringBootStarter保姆級教程

    這篇文章主要為大家介紹了KotlinScript構建SpringBootStarter的保姆級教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • springboot如何初始化執(zhí)行sql語句

    springboot如何初始化執(zhí)行sql語句

    這篇文章主要介紹了springboot初始化執(zhí)行sql語句的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring整合Mybatis具體代碼實現(xiàn)流程

    Spring整合Mybatis具體代碼實現(xiàn)流程

    這篇文章主要介紹了Spring整合Mybatis實操分享,文章首先通過介紹Mybatis的工作原理展開Spring整合Mybatis的詳細內容,需要的小伙伴可以參考一下
    2022-05-05
  • SpringBoot任務之定時任務相關知識總結

    SpringBoot任務之定時任務相關知識總結

    今天給大家整理的文章是SpringBoot定時任務的相關知識點,文中有非常詳細的介紹及代碼示例,對正在學習SpringBoot任務的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • Java實現(xiàn)JWT登錄認證的示例代碼

    Java實現(xiàn)JWT登錄認證的示例代碼

    Java中我們可以使用諸如JJWT這樣的庫來生成和驗證JWT,本文主要介紹了Java實現(xiàn)JWT登錄認證的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • 淺談Java代碼的 微信長鏈轉短鏈接口使用 post 請求封裝Json(實例)

    淺談Java代碼的 微信長鏈轉短鏈接口使用 post 請求封裝Json(實例)

    下面小編就為大家?guī)硪黄獪\談Java代碼的 微信長鏈轉短鏈接口使用 post 請求封裝Json(實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java Spring的數(shù)據(jù)庫開發(fā)詳解

    Java Spring的數(shù)據(jù)庫開發(fā)詳解

    這篇文章主要介紹了Spring的數(shù)據(jù)庫開發(fā),主要圍繞SpringJDBC和Spring Jdbc Template兩個技術來講解,文中有詳細的代碼示例,需要的小伙伴可以參考一下
    2023-04-04
  • 詳解SpringBoot配置連接池

    詳解SpringBoot配置連接池

    本篇文章主要詳解SpringBoot配置連接池,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論

隆化县| 土默特右旗| 高要市| 略阳县| 剑川县| 武鸣县| 阿拉善右旗| 陇南市| 寻乌县| 嵩明县| 德令哈市| 百色市| 缙云县| 霍林郭勒市| 大英县| 和硕县| 乐至县| 郁南县| 吴忠市| 吴旗县| 凤凰县| 临汾市| 钦州市| 峡江县| 图片| 衡阳县| 中阳县| 阿克陶县| 涿州市| 湘潭县| 梁平县| 景宁| 乌拉特中旗| 南江县| 栖霞市| 泰顺县| 汤阴县| 安国市| 长宁区| 宣威市| 沧州市|