005-Spring 扩展点 :PostProcess

目录

Spring 扩展点 :PostProcess

介绍

Spring 核心做的事情其实很简单就是:控制反转和依赖注入

也就是把 Class 解析为 BeanDefinition

然后把 BeanDefinition 创建为 Bean

在这个过程中 Spring 提供了很多扩展点其中一个就是各种PostProcess

这篇文章就简单的分析一下各种PostProcess

PostProcess

大纲

这里整理了一张汇总的大纲图:

青色的是:创建BeanDefinition

红色的是:创建Bean

文字明细

1.BeanDefinitionRegistryPostProcessor

#postProcessBeanDefinitionRegistry

添加beanDefinition到上下文

2.BeanFactoryPostProcessor

#postProcessBeanFactory

处理beanFactory的属性或者使用beanFactory

3.InstantiationAwareBeanPostProcessor

#postProcessBeforeInstantiation

实例化前给一个根据Class对象创建实例的机会

3.1.BeanPostProcessor

#postProcessAfterInitialization

3执行了才会执行这个

初始化后调用,返回原始实例的包装实例

4.SmartInstantiationAwareBeanPostProcessor

#determineCandidateConstructors

实例化阶段:确定实例化使用的构造函数

5.MergedBeanDefinitionPostProcessor

#postProcessMergedBeanDefinition

实例化后、属性赋值前:对Bean定义进行处理

可获取Bean定义的内容 如注解内容等

6.InstantiationAwareBeanPostProcessor

#postProcessAfterInstantiation

属性赋值前:自定义属性注入实现

任何一个返回false就不在进行默认的属性赋值

7.InstantiationAwareBeanPostProcessor

#postProcessProperties

属性赋值前:对属性进行处理

可以解析出用于注入的属性供后续统一设置

或者直接对实例的属性进行设置

8.BeanPostProcessor

#postProcessBeforeInitialization

属性赋值后、初始化前:对实例进行处理

如:设置系统属性

9.BeanPostProcessor

#postProcessAfterInitialization

初始化后调用,返回原始实例的包装实例

10.DestructionAwareBeanPostProcessor

#postProcessBeforeDestruction

销毁前作用于Bean实例

如:执行@PreDestroy的方法

使用方法

首先大家先看上面的大纲和明细,掌握各种PostProcess的大致作用

然后分析一个 PostProcess 实现就可以先看一下其实现的接口

把接口所对应的方法都列出来排序

就大致知道功能是怎么样实现的

示例

@Autowired 功能实现

我们可以用上面的方法来试着分析下 @Autowired 功能实现类 : AutowiredAnnotationBeanPostProcessor

我们先来看下其实现的接口

根据上边的明细和顺序列出

4.SmartInstantiationAwareBeanPostProcessor

#determineCandidateConstructors

实例化阶段:确定实例化使用的构造函数

实际的作用:指定带有@Autowired的构造器作为实例化的构造器

5.MergedBeanDefinitionPostProcessor

#postProcessMergedBeanDefinition

实例化后、属性赋值前:对Bean定义进行处理

可获取Bean定义的内容 如注解内容等

实际的作用:

解析Bean带有@Autowired的字段和方法

属性名、属性类型(AutowiredFieldElement)

方法名、方法参数类型(AutowiredMethodElement)

并存入缓存 injectionMetadataCache

7.InstantiationAwareBeanPostProcessor

#postProcessProperties

属性赋值前:对属性进行处理

可以解析出用于注入的属性供后续统一设置

或者直接对实例的属性进行设置

实际的作用:

获取缓存 injectionMetadataCache

遍历后反射注入

@Resource 功能实现

我们可以用上面的方法再来试着分析下 @Resource 功能实现类 : CommonAnnotationBeanPostProcessor

看一下其实现的接口

根据上边的明细和顺序列出

5.MergedBeanDefinitionPostProcessor

#postProcessMergedBeanDefinition

实例化后、属性赋值前:对Bean定义进行处理

可获取Bean定义的内容 如注解内容等

实际作用是:

解析Bean带有@Resource的字段和方法

属性名、属性类型(ResourceElement)

方法名、方法参数类型(ResourceElement)

并存入缓存 injectionMetadataCache

7.InstantiationAwareBeanPostProcessor

#postProcessProperties

属性赋值前:对属性进行处理

可以解析出用于注入的属性供后续统一设置

或者直接对实例的属性进行设置

实际作用是:获取缓存 injectionMetadataCache 遍历后反射注入

10.DestructionAwareBeanPostProcessor

#postProcessBeforeDestruction

销毁前作用于Bean实例

如:执行@PreDestroy方法

实际作用是:Bean销毁时执行@PreDestroy方法

后记

希望大家之后遇到相关的问题可以试着用这个方法来分析一下

有其他心得也欢迎大家多多交流

另外有一个上面看到的功能就是 InitDestroyAnnotationBeanPostProcessor

这个类大家可以试着分析下

可以把分析结果写在评论里一起学习

相关推荐
apcipot_rain11 分钟前
C++转Java日记(06)
java·开发语言
金銀銅鐵5 小时前
带您看懂字节码指令(一):一帧里有什么
java·后端·ai编程
nice_lcj5207 小时前
【从零理解 Spring AI · 14】RAG 的四个环节:加载、切分、向量化、检索
java·spring boot·embedding·向量数据库·rag·spring ai·ai应用开发
学长毕设8 小时前
基于springboot科创竞赛信息平台-附源码
java·spring boot·后端
聪明的笨猪猪9 小时前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
学长毕设9 小时前
基于SpringBoot公务员考试交流平台-附源码
java·spring boot·后端
SelectDB10 小时前
让变更流出 Doris:Apache Doris 5.0 基于增量计算的 CDC 技术解析
数据库
这个DBA有点耶10 小时前
MCP隔离层+行级语义审计+输出校验:AI访问数据库的安全边界拆解
数据库·人工智能·ai编程
这个DBA有点耶11 小时前
从反向扫描O(n)到正向扫描O(1):降序索引的物理机制与混合排序匹配规则
数据库
SL_staff11 小时前
私有化低代码:面向强监管行业的可控数字化实践
java·低代码