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

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

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

相关推荐
J-Tony1113 分钟前
【Redis】 Redis 是单线程还是多线程
服务器·数据库·mysql
这个DBA有点耶14 分钟前
SQL调优进阶:从“优化一条SQL”到“优化一个系统”的思维升级
java·大数据·数据库·sql·程序人生·dba·改行学it
IvorySQL30 分钟前
PG 日报|SQL/PGQ 图查询基于联接重写机制实现
数据库·人工智能·sql·postgresql·区块链·ivorysql
csdn2015_1 小时前
springboot读取配置的方法
java·spring boot·spring
AOwhisky2 小时前
下一代容器来了?Docker 宣布原生支持 WebAssembly
java·运维·docker·容器·rust·wasm
云云只是个程序马喽3 小时前
海外短剧平台搭建方案:私有化源码系统选型|云微短剧系统技术架构拆解
java·php
数聚天成DeepSData4 小时前
遥感农业数据集下载全攻略
数据库·人工智能·深度学习·机器学习·自然语言处理·数据挖掘
一勺菠萝丶4 小时前
生产环境平滑升级实战-Nginx维护页数据库迁移与安全回滚
数据库·nginx·安全
心静自然凉8004 小时前
MySQL主从同步配置(一主一从)
数据库
C137的本贾尼4 小时前
第七篇:消息队列(MQ)——就是个带存储的异步通信管道
java·开发语言·中间件