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

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

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

相关推荐
thefool11226616 分钟前
TCP 1
java·1024程序员节
不脱发的程序猿1 小时前
纳指ETF量化策略
数据库·人工智能·1024程序员节
程序员塔塔喵2 小时前
【MySQL篇|第一篇】索引失效的情况
数据库·mysql·索引失效
北京青蓝智慧马老师3 小时前
比外部黑客更难防的,是那个有权限的自己人(3 个脱敏复盘)
大数据·数据库·人工智能
金銀銅鐵3 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手3 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
笃行3503 小时前
拆一台数据集成产品:KFS 的骨架、肌肉和神经
数据库
4SAPI3 小时前
搭建 AI 数据分析工具大模型 API 选型指南
数据库·人工智能·架构·php·1024程序员节
paopaokaka_luck5 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
码士集团小青5 小时前
面霸篇:高频 Java 基础问题(核心卷一)
linux·服务器·数据库·redis·缓存·1024程序员节