Spring-分析BeanFactoryPostProcessor后置处理器

本文深入剖析了Spring IoC容器在refresh方法中如何执行BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的后置处理。首先,容器调用invokeBeanFactoryPostProcessors方法,执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法,允许自定义注册beanDefinition。接着,按顺序创建并运行PriorityOrdered、Ordered接口实现类的后置处理方法。最后,按照优先级顺序运行BeanFactoryPostProcessor的postProcessBeanFactory方法。这一过程涉及配置类解析、beanDefinition注册等关键步骤。
部署运行你感兴趣的模型镜像

一、概述

BeanFactoryPostProcessor实现类是在ioc容器进行标准初始化后,可对容器的beanDefinition进行相关操作,此时bean还未实例化。

BeanFactoryPostProcessor:可对容器的beanDefinition信息进行修改

BeanDefinitionRegistryPostProcessor:可自定义向容器注册beanDefinition

二、代码分析

容器在refresh方法中调用invokeBeanFactoryPostProcessors方法创建BeanFactoryPostProcessor实现类并运行后置处理方法。

1、在invokeBeanFactoryPostProcessors方法中,先运行容器已有的beanFactory后置处理器集合中实现BeanDefinitionRegistryPostProcessor接口的实现类的postProcessBeanDefinitionRegistry方法。

BeanDefinitionRegistryPostProcessor接口继承了BeanFactoryPostProcessor接口,我们可通过实现BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法中注册自定义的beanDefinition到容器中。

2、接着扫描得到容器中实现BeanDefinitionRegistryPostProcessor接口的beanDefinition集合,按照顺序先创建实现PriorityOrdered接口的实现类对象,调用invokeBeanDefinitionRegistryPostProcessors方法运行对象的postProcessBeanDefinitionRegistry方法。

例如:ConfigurationClassPostProcessor实现BeanDefinitionRegistryPostProcessorPriorityOrdered接口,在此处会运行ConfigurationClassPostProcessorpostProcessBeanDefinitionRegistry方法扫描容器的配置类得到beanDefinition集合

ConfigurationClassPostProcessor解析配置类流程可参考分析-ConfigurationClassPostProcessor原理_Just-Today的博客-优快云博客

3、接着在创建运行实现Ordered接口的BeanDefinitionRegistryPostProcessor实现类对象并运行方法。

4、创建没实现PriorityOrderedOrdered接口的BeanDefinitionRegistryPostProcessor实现类对象并运行方法。

5、接着按照顺序先创建实现了PriorityOrdered接口的BeanFactoryPostProcessor实现类对象,通过invokeBeanFactoryPostProcessors方法遍历BeanFactoryPostProcessor集合运行postProcessBeanFactory方法

6、在创建实现了Ordered接口的BeanFactoryPostProcessor实现类并运行方法。

7、最后在运行没实现PriorityOrderedOrdered接口的BeanFactoryPostProcessor实现类并运行方法。

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

Spring中的前置处理器和后置处理器是用来在Bean的实例化和初始化过程中进行一些额外的处理的。前置处理器是BeanFactoryPostProcessor接口的实现类,它在Spring容器加载Bean的定义之后,实例化Bean之前进行一些配置的修改或者其他操作。它可以对Bean的定义进行解析和修改,最终将修改后的Bean定义添加到Spring的BeanDefinitionMap中。\[1\]后置处理器是BeanPostProcessor接口的实现类,它在Bean的实例化和初始化过程中,对Bean进行一些额外的处理。它可以在Bean实例化后对Bean进行修改,也可以在Bean初始化前后对Bean进行一些操作,比如动态代理等。\[2\]在调用前置处理器的时候,Spring会按照优先级进行分类调用。实现了PriorityOrdered接口的前置处理器会先被调用,然后是实现了Ordered接口的前置处理器,最后是没有实现这两个接口的前置处理器。\[3\]这样可以确保前置处理器按照指定的顺序进行调用,以满足不同的需求。 #### 引用[.reference_title] - *1* *3* [攀登Spring珠穆朗玛峰:前置与后置处理器](https://blog.youkuaiyun.com/qq_38289451/article/details/122226807)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Spring Bean前置后置处理器的使用](https://blog.youkuaiyun.com/weixin_40834464/article/details/82832173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值