BeanFactoryPostProcessor 和 BeanPostProcessor 是 Spring 框架提供的两个重要扩展点,它们在 Bean 生命周期的不同阶段允许开发者对其进行定制。
Bean 生命周期回顾
在了解这两个接口的作用之前,我们先简单了解一下 Spring Bean 的生命周期:
- Bean 定义加载: Spring 容器读取 Bean 定义(XML、注解、Java 配置)。
BeanFactoryPostProcessor调用 (可选): 在 Bean 实例化之前,修改BeanFactory的配置元数据。BeanDefinitionRegistryPostProcessor调用 (可选): 在 Bean 定义加载完成后,但在 Bean 实例化之前执行,允许添加、删除或修改 Bean 定义。- 实例化 (Instantiation): Spring 容器创建 Bean 的实例(通过构造函数或工厂方法)。
- 属性填充 (Populate Properties): Spring 容器为 Bean 的属性赋值(Setter 注入、字段注入)。
- Aware 接口回调: 如果 Bean 实现了 Aware 接口,Spring 容器会调用相应的方法。
BeanPostProcessor前置处理: 调用BeanPostProcessor的postProcessBeforeInitialization方法。- 初始化 (Initialization):
@PostConstruct注解标注的方法InitializingBean接口的afterPropertiesSet方法- Bean 定义中指定的
init-method方法
BeanPostProcessor后置处理: 调用BeanPostProcessor的postProcessAfterInitialization方法。- Bean 就绪 (Ready to Use): Bean 可以被应用程序使用了。
- 销毁 (Destruction): (容器关闭, 且Bean的作用域是singleton)
@PreDestroy注解标注的方法DisposableBean接口的destroy方法- Bean 定义中指定的
destroy-method方法
BeanFactoryPostProcessor 的作用:
-
作用时机: 在 Bean 定义加载完成之后、Bean 实例化 之前。
-
作用对象:
BeanFactory本身以及 Bean 定义 (BeanDefinition)。 -
主要功能:
- 修改 Bean 定义: 这是
BeanFactoryPostProcessor最重要的功能。它可以修改BeanDefinition的任何属性,例如:- 修改 Bean 的类名 (
setBeanClassName) - 修改 Bean 的作用域 (
setScope) - 修改 Bean 的属性值 (
getPropertyValues().addPropertyValue(...)) - 添加或删除 Bean 的依赖关系 (
setDependsOn) - 修改 Bean 的初始化方法和销毁方法 (
setInitMethodName,setDestroyMethodName) - 修改 Bean 的自动装配模式 (
setAutowireMode) - 等等
- 修改 Bean 的类名 (
- 注册自定义的属性编辑器 (PropertyEditor): 可以使用
ConfigurableBeanFactory的registerCustomEditor方法注册自定义的PropertyEditor,用于将字符串类型的配置值转换为 Bean 属性所需的类型。 - 读取外部配置: 可以读取外部配置文件(例如,properties 文件、YAML 文件、数据库等),并根据配置信息修改 Bean 定义。
- 修改 Bean 定义: 这是
-
执行顺序: 如果有多个
BeanFactoryPostProcessor, Spring 会根据它们的顺序(PriorityOrdered、Ordered或无序)依次调用。BeanDefinitionRegistryPostProcessor会先于普通的BeanFactoryPostProcessor执行.
BeanPostProcessor 的作用:
-
作用时机: 在 Bean 实例化、属性填充 之后,但在 Bean 初始化方法执行 前后。
-
作用对象: Bean 实例。
-
主要功能:
- 修改 Bean 实例: 可以修改 Bean 的属性值,或者返回一个完全不同的 Bean 实例(例如,代理对象)。
- 执行自定义的初始化逻辑: 可以在 Bean 初始化之前或之后执行一些自定义的逻辑。
- AOP (面向切面编程): Spring AOP 就是通过
BeanPostProcessor来实现的。AbstractAutoProxyCreator就是一个BeanPostProcessor,它会在 Bean 初始化后创建代理对象。 - 处理注解: 例如处理
@Autowired、@Value、@Resource等注解。
-
关键方法:
postProcessBeforeInitialization(Object bean, String beanName): 在 Bean 初始化 之前 调用。postProcessAfterInitialization(Object bean, String beanName): 在 Bean 初始化 之后 调用。
-
执行顺序: 如果有多个
BeanPostProcessor,Spring 会根据它们的顺序(PriorityOrdered、Ordered或无序)依次调用。
BeanFactoryPostProcessor 和 BeanPostProcessor 在 Bean 生命周期中的位置:
+-----------------------+
| Bean 定义加载 |
+-----------------------+
|
V
+-----------------------+
| BeanFactoryPostProcessor| <-- 在 Bean 实例化之前调用,修改 Bean 定义
+-----------------------+
|
V
+------------------------+
|BeanDefinitionRegistryPP| <-- 在 Bean 定义加载完成后,但在 Bean 实例化之前执行,允许添加、删除或修改 Bean 定义
+------------------------+
|
V
+-----------------------+
| 实例化 |
+-----------------------+
|
V
+-----------------------+
| 属性填充 |
+-----------------------+
|
V
+-----------------------+
| Aware 接口回调 |
+-----------------------+
|
V
+-----------------------+
| BeanPostProcessor | <-- 在初始化之前调用,修改 Bean 实例或执行自定义逻辑
| (前置处理) |
+-----------------------+
|
V
+-----------------------+
| 初始化 |
+-----------------------+
|
V
+-----------------------+
| BeanPostProcessor | <-- 在初始化之后调用,修改 Bean 实例或执行自定义逻辑 (AOP)
| (后置处理) |
+-----------------------+
|
V
+-----------------------+
| Bean 就绪 |
+-----------------------+
|
V
+-----------------------+
| 销毁 |
+-----------------------+
总结:
BeanFactoryPostProcessor在 Bean 实例化之前修改 Bean 定义,影响所有 Bean 的创建过程。BeanPostProcessor在 Bean 初始化前后修改 Bean 实例,可以针对特定 Bean 或所有 Bean 进行处理。- 这两个接口都是 Spring 框架的重要扩展点,允许我们在开发时对Bean 生命周期的不同阶段进行自定义,实现更灵活、更强大的功能。

928

被折叠的 条评论
为什么被折叠?



