BeanFactoryPostProcessor 和 BeanPostProcessor 是 Spring 框架中用于在 Bean 创建和初始化过程中的两个扩展点。它们通过不同的方式影响 Bean 的创建和初始化:
1. BeanFactoryPostProcessor 的影响:
- 作用时机: Bean 定义加载完成之后、Bean 实例化 之前。
- 作用对象:
BeanFactory本身以及BeanDefinition。 - 影响方式:
- 修改 Bean 定义 (
BeanDefinition):BeanFactoryPostProcessor可以获取到ConfigurableListableBeanFactory对象,通过该对象可以获取到所有已注册的BeanDefinition,并对其进行修改。这会直接影响到后续 Bean 的创建过程,因为 Spring 容器会根据修改后的BeanDefinition来创建 Bean 实例。- 修改 Bean 的类: 可以将 Bean 的类替换为另一个类(例如,代理类)。
- 修改 Bean 的作用域: 可以将 Bean 的作用域从 singleton 改为 prototype,或者反过来。
- 修改 Bean 的属性值: 可以添加、修改或删除 Bean 的属性值。
- 修改 Bean 的依赖关系: 可以添加或删除 Bean 的依赖关系。
- 修改 Bean 的初始化方法和销毁方法: 可以修改 Bean 的初始化方法和销毁方法。
- 修改 Bean 的自动装配模式: 可以修改 Bean 的自动装配模式。
- 等等
- 注册自定义的属性编辑器 (PropertyEditor):
BeanFactoryPostProcessor可以注册自定义的PropertyEditor,用于将字符串类型的配置值转换为 Bean 属性所需的类型。 这会影响到后续 Bean 的属性填充过程。 - 读取外部配置:
BeanFactoryPostProcessor可以读取外部配置文件(例如,properties 文件、YAML 文件、数据库等),并根据配置信息修改 Bean 定义。 这会影响到后续 Bean 的创建和配置过程。 - 影响范围:
BeanFactoryPostProcessor会影响到 所有 Bean 的创建过程, 因为它修改的是BeanDefinition。
- 修改 Bean 定义 (
2. BeanPostProcessor 的影响:
- 作用时机: Bean 实例化、属性填充 之后,但在 Bean 初始化方法(
@PostConstruct、InitializingBean.afterPropertiesSet、init-method)执行 前后。 - 作用对象: Bean 实例。
- 影响方式:
- 修改 Bean 实例:
BeanPostProcessor可以获取到 Bean 实例,并对其进行修改。- 修改 Bean 的属性值: 可以修改 Bean 的属性值。
- 返回一个不同的 Bean 实例: 可以返回一个完全不同的 Bean 实例(例如,代理对象)来替换原始的 Bean 实例。这是 Spring AOP 实现的关键。
- 执行自定义的初始化逻辑:
BeanPostProcessor可以在 Bean 初始化之前或之后执行一些自定义的逻辑。postProcessBeforeInitialization: 在 Bean 初始化之前调用,可以执行一些准备工作,或者修改 Bean 的属性。postProcessAfterInitialization: 在 Bean 初始化之后调用,可以执行一些收尾工作,或者创建代理对象。
- 处理注解:
- 例如,
AutowiredAnnotationBeanPostProcessor处理@Autowired、@Value、@Inject等注解,实现依赖注入。 CommonAnnotationBeanPostProcessor处理@PostConstruct、@PreDestroy、@Resource等注解.
- 例如,
- 影响范围:
BeanPostProcessor会影响到容器中 所有 的 Bean (除非在BeanPostProcessor的实现中进行过滤)。
- 修改 Bean 实例:
InstantiationAwareBeanPostProcessor:
BeanPostProcessor的子接口.- 可以在Bean实例化 前后 以及属性注入 期间 进行干预。
- 它提供了以下方法:
postProcessBeforeInstantiation: 在 Bean 实例化之前调用。可以返回一个代理对象来代替目标 Bean。postProcessAfterInstantiation: 在 Bean 实例化之后、属性注入之前调用。可以控制是否要对 Bean 进行属性注入。postProcessProperties/postProcessPropertyValues: 在属性注入期间调用,可以修改属性值。
总结影响:
| 接口 | 作用时机 | 作用对象 | 影响方式 |
|---|---|---|---|
BeanFactoryPostProcessor | Bean 定义加载完成之后、Bean 实例化 之前 | BeanFactory 和 BeanDefinition | 修改 Bean 定义、注册自定义属性编辑器、读取外部配置 |
BeanPostProcessor | Bean 实例化、属性填充 之后,但在 Bean 初始化方法执行 前后 | Bean 实例 | 修改 Bean 实例、执行自定义初始化逻辑、AOP 代理、处理注解 |
InstantiationAwareBeanPostProcessor | Bean实例化 前后 以及属性注入 期间 | Bean实例, BeanDefinition | 控制Bean的实例化过程, 属性注入过程; 可以返回代理对象; 可以修改属性值. |
流程图示:
+----------------------+
| 读取 Bean 定义 |
+----------------------+
|
V
+----------------------+
| BeanFactoryPostProcessor| <-- 修改 BeanDefinition
+----------------------+
|
V
+----------------------+
| 实例化 Bean |
+----------------------+
|
V
+----------------------+
| 属性填充 |
+----------------------+
|
V
+----------------------------------------------+
| InstantiationAwareBeanPostProcessor(可选) | <-- 实例化前后, 属性注入期间
+----------------------------------------------+
|
V
+----------------------+
| Aware 接口回调 |
+----------------------+
|
V
+----------------------+
| BeanPostProcessor | <-- 初始化之前 (postProcessBeforeInitialization)
| (前置处理) |
+----------------------+
|
V
+----------------------+
| 初始化 Bean | (@PostConstruct, InitializingBean, init-method)
+----------------------+
|
V
+----------------------+
| BeanPostProcessor | <-- 初始化之后 (postProcessAfterInitialization) (AOP 代理)
| (后置处理) |
+----------------------+
|
V
+----------------------+
| Bean 就绪 |
+----------------------+
通过 BeanFactoryPostProcessor 和 BeanPostProcessor,Spring 提供了强大的扩展机制,允许开发者在 Bean 创建和初始化的不同阶段进行扩展,实现各种高级功能,如 AOP、属性占位符替换、自定义初始化逻辑等。
928

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



