小明学Spring Framework容器启动系列——BeanPostProcessor和BeanFactoryPostProcessor的初始化

本文介绍了Spring框架在启动过程中BeanFactoryPostProcessor和BeanPostProcessor的初始化及其作用。BeanFactoryPostProcessor允许在bean实例化前修改bean定义,而BeanPostProcessor则对bean实例化前后进行处理。文章详细讲解了这两个接口的实现、实例化方式以及它们在Spring容器启动阶段的位置,同时探讨了Autowired在BeanPostProcessor中的应用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


系列文章——小明学Spring Framework容器启动系列
1. 小明学Spring Framework容器启动系列——Spring Framework容器启动概览 2. 小明学Spring Framework容器启动系列——Bean定义的读取
3. 小明学Spring Framework容器启动系列——Bean定义的解析 4.小明学Spring Framework容器启动系列——Bean名称生成策略
5.小明学Spring Framework容器启动系列——Bean定义的注册 6.小明学Spring Framework容器启动系列——容器PrepareRefresh
7.小明学Spring Framework容器启动系列——BeanFactory的初始化 8.小明学Spring Framework容器启动系列——BeanPostProcessor和BeanFactoryPostProcessor的初始化
9.小明学Spring Framework容器启动系列——国际化与事件的初始化 10.小明学Spring Framework容器启动系列——BeanFactory的初始化完成
11. 小明学Spring Framework容器启动系列——容器启动的收尾工作

1. 前言

1. 前言

Spring容器可以使用BeanFactory按照用户的定义生成各种Bean,但是如果用户需要在生成Bean的过程中进行一些进行一些自定一加工,就需要用到BeanPostProcessor和BeanFactoryPostProcessor。其中BeanFactoryPostProcessor用于对BeanFactory进行处理,比如增加或者修改Bean的定义,而BeanPostProcessor用于对Bean的实例化前后进行处理。那么这些处理器是什么时候添加到Bean的容器中生效的呢?这些处理器的初始化环节在整个Spring容器启动过程中的位置如图中的红色方框部分所示。这个阶段执行完成之后,SprignFactory就已经基本初始化完成,用户可以通过GetBean获取对应的Bean。
在这里插入图片描述
Spring Refresh 阶段调用BeanFactoryPostProcessors和注册BeanPostProcessors的源码如下所示,注意BeanFactoryPostProcessors使用的是"invoke"描述,而BeanPostProcessors使用的是"register"。

	StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
	// Invoke factory processors registered as beans in the context.
	invokeBeanFactoryPostProcessors(beanFactory);

	// Register bean processors that intercept bean creation.
	registerBeanPostProcessors(beanFactory);
	beanPostProcess.end();

2. BeanFactoryPostProcessor介绍

BeanFactoryPostProcessor是实现spring容器功能扩展的重要接口,例如修改bean属性值,实现bean动态代理等。很多框架都是通过此接口实现对spring容器的扩展,例如mybatis与spring集成时,只定义了mapper接口,无实现类,但spring却可以完成自动注入,是不是很神奇?BeanFactoryPostProcessor接口的定义如下:

@FunctionalInterface
public interface BeanFactoryPostProcessor {
   

	/**
	 * Modify the application context's internal bean factory after its standard
	 * initialization. All bean definitions will have been loaded, but no beans
	 * will have been instantiated yet. This allows for overriding or adding
	 * properties even to eager-initializing beans.
	 */
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

BeanFactoryPostProcessor接口是针对bean容器的,它的实现类可以在当前BeanFactory初始化(spring容器加载bean定义文件)后࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-御狐神-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值