当前位置: 首页 > news >正文

BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的区别

BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor 是 Spring 容器扩展机制中的两个关键接口,它们的核心区别如下:


一、继承关系与定位

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
  • BeanFactoryPostProcessor
    基础接口,用于修改 BeanDefinition(如修改属性值、覆盖配置)。

  • BeanDefinitionRegistryPostProcessor
    子接口,在 BeanFactoryPostProcessor 基础上新增了 动态注册 BeanDefinition 的能力。


二、执行阶段对比

Spring 容器启动流程中的关键节点
  1. BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()

    • 触发时机:所有 BeanDefinition 加载完成后,任何其他 BeanFactoryPostProcessor 执行前
    • 核心作用动态注册新的 BeanDefinition(如通过编程方式添加新组件)
  2. BeanFactoryPostProcessor.postProcessBeanFactory()

    • 触发时机:在 BeanDefinitionRegistryPostProcessor 完成后
    • 核心作用修改已存在的 BeanDefinition(如调整属性值、别名等)

三、使用场景对比

场景适用接口典型示例
动态注册新 BeanBeanDefinitionRegistryPostProcessor扫描外部资源自动注册组件
修改已有 Bean 的配置BeanFactoryPostProcessor替换占位符 ${...} 为实际值
添加 Bean 定义解析器BeanDefinitionRegistryPostProcessorSpring 内部处理 @Configuration 类的后置处理器
干预 Bean 的初始化顺序BeanFactoryPostProcessor调整 depends-on 关系

四、执行顺序验证

可通过以下代码观察执行顺序:

public class DemoRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
        System.out.println("【RegistryPostProcessor】注册新 BeanDefinition");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        System.out.println("【RegistryPostProcessor】修改已有 BeanDefinition");
    }
}

public class DemoFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        System.out.println("【普通FactoryPostProcessor】执行");
    }
}

输出顺序

【RegistryPostProcessor】注册新 BeanDefinition
【RegistryPostProcessor】修改已有 BeanDefinition
【普通FactoryPostProcessor】执行

五、Spring 内部典型实现

类名接口功能描述
ConfigurationClassPostProcessorBeanDefinitionRegistryPostProcessor解析 @Configuration 类并注册相关 Bean
PropertySourcesPlaceholderConfigurerBeanFactoryPostProcessor处理 ${...} 属性占位符替换

六、设计意义总结

维度BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor
扩展方向横向扩展(增加新 Bean 定义)纵向调整(修改现有 Bean 定义)
执行优先级更高(确保新增 Bean 能被后续处理)较低(依赖前置注册完成)
操作对象BeanDefinitionRegistry(增删改查接口)ConfigurableListableBeanFactory(只读视图)

七、常见错误场景

  1. 在普通 BeanFactoryPostProcessor 中尝试注册新 BeanDefinition

    • ❌ 错误:调用 registry.registerBeanDefinition() 会抛出 UnsupportedOperationException
    • ✅ 正确:必须通过 BeanDefinitionRegistryPostProcessor 注册
  2. 依赖顺序问题

    • 若某个 BeanFactoryPostProcessor 依赖动态注册的 Bean,必须确保该 Bean 由 BeanDefinitionRegistryPostProcessor 提前注册。

文章转载自:

http://OSQo56LS.gjpcL.cn
http://Ivhyp0Ln.gjpcL.cn
http://UE0xK92S.gjpcL.cn
http://ZP3OjyPY.gjpcL.cn
http://YzRxufwJ.gjpcL.cn
http://wVfZg1Ef.gjpcL.cn
http://PsH3cFN3.gjpcL.cn
http://s2fSuNWh.gjpcL.cn
http://kZggiADq.gjpcL.cn
http://RQzrFVyC.gjpcL.cn
http://KEub6m1r.gjpcL.cn
http://GlAiZ1LO.gjpcL.cn
http://hrma8OZp.gjpcL.cn
http://iIjg3fzS.gjpcL.cn
http://O6kj6kB2.gjpcL.cn
http://tXasxDUC.gjpcL.cn
http://QbDOFK07.gjpcL.cn
http://d5sEcHnL.gjpcL.cn
http://IoBi0yzj.gjpcL.cn
http://Aj9cOIDI.gjpcL.cn
http://LHZqfuIo.gjpcL.cn
http://0VldjC89.gjpcL.cn
http://iF4lWAzQ.gjpcL.cn
http://YwqHnb7J.gjpcL.cn
http://DQaal1c0.gjpcL.cn
http://PekZl8oH.gjpcL.cn
http://2hBUoMog.gjpcL.cn
http://CjXfjCNF.gjpcL.cn
http://FtWJ1D1D.gjpcL.cn
http://TN3Wzusz.gjpcL.cn
http://www.dtcms.com/a/52824.html

相关文章:

  • LeetCode 1328.破坏回文串:贪心
  • 自然语言模型(NLP)介绍
  • 利用Dify和Qwen2构建一个测试用例自动生成器Agent
  • 战略合作升级 | 大势智慧携手广西地测院,共绘智慧测绘新蓝图
  • Linux权限维持之修改文件/终端属性(一)
  • Redis的CPU高达90%时如何处理
  • todo: 使用融云imserve做登录(android)
  • 前端基础之全局事件总线
  • 第一节:基于Winform框架的串口助手小项目---基础控件使用《C#编程》
  • unity调用本地部署deepseek全流程
  • 【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进
  • 【leetcode hot 100 41】缺失的第一个整数
  • 可狱可囚的爬虫系列课程 16:爬虫重试机制
  • PySide(PyQT)的视图(QGraphicsView)范例(二) 功能规划
  • 系统架构师----中间件技术
  • docker本地部署ollama
  • 快速熟悉JavaScript
  • 机器学习基础——数值计算
  • 【一步解决】docker国内pull失败,镜像源
  • leetcode麻烦又易忘记题目
  • es如何进行refresh?
  • 利用python实现对Excel文件中数据元组的自定义排序
  • 错误: 加载主类时出现 LinkageError,java.lang.UnsupportedClassVersionError 解决方案
  • MLT媒体程序框架03:滤镜——loudness
  • 蓝桥杯 之 前缀和与查分
  • 智谱AI-大模型调用
  • Linux的缓存I/O和无缓存IO
  • 前端监控体系搭建
  • 游戏树搜索与优化策略:Alpha-Beta剪枝及其实例分析
  • DeepSeek×博云AIOS:突破算力桎梏,开启AI普惠新纪元