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

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

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

相关推荐
海兰1 小时前
【数据库】tdsql(mysql8.0)优化思考三
数据库·redis
煎饼学大模型2 小时前
Agent 的“大脑-手“解耦架构:当推理层和工具执行层各自独立演进
数据库·人工智能·oracle·架构·agent
头发还在的女程序员2 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats3 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123453 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
都叫我大帅哥6 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
muddjsv6 小时前
SQLite数据库文件机制详解:journal、wal、shm文件作用与备份避坑
数据库·sqlite
wanderist.6 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
吴声子夜歌7 小时前
MongoDB 4.2——应用程序设计
数据库·mongodb
数字新视界7 小时前
动环监控可视化在数据中心管理中的应用与实践解析
数据库·物联网·解决方案·动环监控·大榕树