005-Spring 扩展点 :PostProcess
目录
- Spring 扩展点 :PostProcess
- 介绍
- PostProcess
- 大纲
- 文字明细
- 使用方法
- 示例
- @Autowired 功能实现
- @Resource 功能实现
- 后记
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
这个类大家可以试着分析下
可以把分析结果写在评论里一起学习
相关文章:
005-Spring 扩展点 :PostProcess
目录 Spring 扩展点 :PostProcess介绍PostProcess大纲文字明细使用方法示例Autowired 功能实现Resource 功能实现 后记 Spring 扩展点 :PostProcess 介绍 Spring 核心做的事情其实很简单就是:控制反转和依赖注入 也就是把 Class 解析为 Bea…...
MFC中的窗体绘制事件函数:OnCtlColor、OnPaint、OnNcPaint、OnDrawItem、OnEraseBkgnd、OnDraw
文章目录 CWnd::OnCtlColorCWnd::OnPaintCWnd::OnNcPaintCWnd::OnDrawItemCWnd::OnEraseBkgndCWnd::InvalidateRectCView::OnDraw 参考:https://learn.microsoft.com/ CWnd::OnCtlColor 即将绘制子控件时,框架会调用此成员函数。 afx_msg HBRUSH OnCt…...
dialogbot:开箱即用的对话机器人解决方案,涵盖问答型对话、任务型对话和聊天型对话等多种场景,为您提供全方位的对话交互体验。
dialogbot:开箱即用的对话机器人解决方案,涵盖问答型对话、任务型对话和聊天型对话等多种场景,支持网络检索问答、领域知识问答、任务引导问答和闲聊问答,为您提供全方位的对话交互体验。 人机对话系统一直是AI的重要方向…...
TCP服务器—实现数据通信
目录 前言 1.接口介绍 2.编写服务器 3.编写客户端 4.编译链接 5.测试 6.总结 前言 今天我们要介绍的是使用TCP协议实现数据通信,相比于之前写的UDP服务器实现数据信,在主体逻辑上并没有差别。客户端向服务器发送信息,服务器接受信息并回…...
基于SpringBoot实现MySQL备份与还原
基于SpringBoot实现MySQL备份与还原,需求是在页面上对所有的平台数据执行备份和恢复操作,那么就需要使用代码去调用MySQL备份和恢复的指令,下面是具体实现步骤; MySQL备份表设计 CREATE TABLE IF NOT EXISTS mysql_backups (id …...
【VUE 监听用户滑动】
监听滑动方法 一. touchstart、touchmove、touchend二.v-touch三. 自定义指令 一. touchstart、touchmove、touchend 在 Vue 中监听用户往哪个方向滑动可以通过添加事件监听器,然后在事件回调函数中判断滑动方向。常用的事件监听器有touchstart、touchmove、touche…...
通义大模型:打造更智能、更灵活的自然语言处理技术
大家好,今天我想向大家介绍一款备受瞩目的自然语言处理技术——通义大模型。作为一种基于深度学习的人工智能技术,通义大模型能够模拟人类的思维方式,实现更智能、更灵活的自然语言处理,为我们的生活和工作带来了极大的便利。 在…...
Go 流程控制
if语句使用 package mainimport "fmt"func main() {score : 700if score 700 {fmt.Println("清华")}//if支持一个初始化语句 初始化语句和条件判断用;分割if a : 700; a 700 {fmt.Println("清华")}}清华 清华if_else使用 package mainimpor…...
Python opennsfw/opennsfw2 图片/视频 鉴黄 笔记
nsfw( Not Suitable for Work)直接翻译就是 工作的时候不适合看,真文雅 nsfw效果,注意底部的分数 大体流程,输入图片/视频,输出0-1之间的数字,一般情况下,Scores < 0.2 认为是非…...
四、Linux中cd、pwd以及相对/绝对路径和特殊路径符
1、cd命令: cd命令可以切换当前工作目录,基础语法是: cd [linux路径] (1)、打开Linux的命令提示行,当前工作目录是home,输入“cd /”,可以切换到根目录下,在根目录下输…...
第八章 CUDA内存应用与性能优化篇(上篇)
cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…...
chrome浏览器改为黑色背景
chrome浏览器改为黑色背景 https://blog.csdn.net/yuchen_123456/article/details/127487278 不一样的地方:...
【AI】《动手学-深度学习-PyTorch版》笔记(十七):卷积神经网络入门
AI学习目录汇总 1、从全链接层到卷积 1.1 卷积 我们在前面学习的多层感知机中,已经认识了全链接层,缺点很明显,在稍微大点的网络模型中,参数成指数级别增长。参数量很快就达到数十亿,这样的量级几乎无法计算。为此科学家们想出一个减少参数的方法:卷积。 从全链接层到…...
element-ui table表格,根据缩放自适应
安装依赖 npm install af-table-columnmain.js 中引入依赖, import Vue from vue import ElementUI from element-ui //需要按需引入,先引入vue并引入element-ui import AFTableColumn from af-table-column Vue.use(AFTableColumn)demo样式࿱…...
【electron】electron安装过慢和打包报错:Unable to load file:
文章目录 一、安装过慢问题:二、打包报错:Unable to load file: 一、安装过慢问题: 一直处于安装过程 【解决】 #修改npm的配置文件 npm config edit#添加配置 electron_mirrorhttps://cdn.npm.taobao.org/dist/electron/二、打包报错:Unable to load…...
微服务部署中的动态扩缩容和故障迁移实践经验!快来看看!
随着微服务架构的快速普及,越来越多的组织开始将传统的单体应用转变为分布式的微服务系统。在这种架构下,动态扩缩容和故障迁移变得尤为重要,因为它们能够帮助我们应对不断变化的负载和故障情况。本文将详细介绍动态扩缩容和故障迁移的概念&a…...
代码随想录第四十五天
代码随想录第四十五天 Leetcode 70. 爬楼梯Leetcode 322. 零钱兑换Leetcode 279. 完全平方数 Leetcode 70. 爬楼梯 题目链接: 爬楼梯 自己的思路:之前是用斐波那契做的,但是现在学了完全背包,可以将m2拓展的更大一点,我们可以将楼顶n设为背包…...
Vue Baidu Map--自定义点图标bm-marker
自定义点图标 将准备好的图标放到项目中 使用import引入, 并在data中进行声明 <script> import mapIconRed from ./vue-baidu-map/img/marker_red_sprite.png export default {data() {return {mapIconRed,}}, } </script>在<bm-marker>中加入参…...
ZooKeeper的基本概念
集群角色 通常在分布式系统中,构成一个集群的每一台机器都有自己的角色,最典型的集群模式就是Master/Slave模式(主备模式)。在这种模式中,我们把能够处理所有写操作的机器称为Master机器,把所有通过异步复制方式获取最新数据&…...
SpringBoot复习:(51)默认情况下DataSource是怎么创建出来的,是什么类型的?
DataSource是通过DataSourceAutoConfiguration创建的,这个类代码如下: 可以看到DataSourceAutoConfiguration有个静态内部类PooledDataSourceConfiguration,在这个类上有个Import注解,导入了DataSourceConfiguration.Hikari这个类࿰…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
