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这个类࿰…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
