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

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

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

相关推荐
你的微笑,乱了夏天几秒前
linux centos 7 安装 mongodb7
数据库·mongodb
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭12 分钟前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
工业甲酰苯胺12 分钟前
分布式系统架构:服务容错
数据库·架构
暮湫28 分钟前
泛型(2)
java
超爱吃士力架33 分钟前
邀请逻辑
java·linux·后端
南宫生37 分钟前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石1 小时前
12/21java基础
java
李小白661 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp1 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
独行soc1 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘