【Spring源码】CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()详解

news2025/1/13 13:58:17

CommonAnnotationBeanPostProcessor的postProcessMergedBeanDefinition()中一共包含3个方法,上篇文章我们介绍了的第一个方法,它一个父类调用(如下图),其实就是处理@PostConstruct和@PreDestroy这两个注解的

这篇我们继续介绍后面两个方法( ̄∇ ̄)

findResourceMetadata()

在这个方法中会找出beanType所有被@Resource注解标记的字段/方法,并将它们封装到对象InjectionMetadata中

方法中先获取对应的beanName来作为缓存的key,然后尝试从缓存中获取注入的元数据对象,对获取到的对象进行判断,如果不需要更新则直接返回;如果需要更新则进行更新,并将返回的metadata对象放入injectionMetadataCache缓存中,缓存的key为beanName,以便后续操作从缓存中取出

buildResourceMetadata()、构建元数据对象

方法的一开始先判断当前clazz是否是候选class,然后创建InjectedElement集合对象,之后进入了一个do while循环♻️,这个循环会不断获取父类进行注解的识别(仅识别,不会进行属性的注入,具体解析位置同@Autowired),直到当前类为null或者父类为Object.java

循环内主要有两大部分:

第一部分

通过doWithLocalFields()方法查询是否属性字段上有webService、ejb、Resource的属性注解,进行了如下一系列判断:

webService

webServiceRefClass != null && field.isAnnotationPresent(webServiceRefClass)是对是否加载了"javax.xml.ws.WebServiceRef"进行判断(具体赋值位置如下图)

(在注解为Resource时需要注意⚠️:1. 不支持静态属性;2. 如果不想注入某一类型对象,可以将其加入ignoredResourceType中,字段会封装到ResourceElement中)

ejb

接着是对ejbClass != null && field.isAnnotationPresent(ejbClass)的判断(具体赋值位置如下图)

Resource

最后是对于field.isAnnotationPresent(Resource.class)的判断,Resource注解一般用在类属性或者setter()方法上声明属性需要自动装配,默认byName的形式,找不到则尝试byType的形式(@Autowired则默认byType的形式注入)

第二部分

通过doWithLocalMethods()方法查询是否有方法上有webService、ejb、Resource的属性注解

最终会获取一个集合elements完成buildResourceMetadata()的逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一起聊聊数据治理

统一赵秦车轨,推行秦篆,统一七国文字,兵器统一标准,统一度量衡… 我们优秀的数据治理专家-秦始皇! 数据治理这个名字起得好,一般人听不懂,实际上并不是IT人员的专属,广义上来说我们日…

纳米软件分享:为什么要进行电池充放电测试?电池充放电系统测试步骤

在日常生活中电能一直是我们接触过的最为方便的能源,而我们也通过各种方法对电能进行储存从而让我们能随时随地的使用这种能源,比如手机中的锂电池、电动车中的充电电池等。 充电锂电池经过多年的技术革新,综合性能不断提升,已经应…

基于node.js和Vue的食堂窗口美食评价系统/美食网站

摘要本论文主要论述了如何使用Node.js语言开发一个食堂窗口美食评价系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述食堂窗口美食评价系统的当前背景以及系…

【高级人工智能】国科大《高级人工智能》联结主义 笔记 + 考试回忆

国科大《高级人工智能》吴老师部分——联结主义笔记 吴老师上课dddd,上课东西太多太杂,听不太懂比较煎熬,但是课后花点时间理解理解,还是挺有帮助的考试按照重点复习即可,虽然答疑时提到的传教士野人没考😅…

神经网络、激活函数

目录1.双层神经网络计算神经网络层数的时候不包括输入层。2.逻辑回归的神经网络如何实现隐藏单元如何计算?,3x1矩阵,3x1矩阵,上标[1]表示第一层向量化(单个训练样本):隐藏层:,,为4x3矩阵,x为3x1…

spring cloud gateway 整合sentinel使用过程使用遇到的问题

最近在进行spring cloud gateway 整合 sentinel 在此过程中遇到的问题进行汇总 1. spring gateway 整合sentinel gateway的路由会自动加一个前缀 效果如下 问题原因 代码在 org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator#DiscoveryClie…

【迅为iMX6Q】开发板 Linux 5.15.71 RTL8211E 以太网驱动适配

相关参考 【迅为iMX6Q】开发板 u-boot 2022.04 SD卡 启动 【迅为iMX6Q】开发板 u-boot 2020.04 RTL8211E 以太网驱动适配 【迅为iMX6Q】开发板 Linux 5.15.71 SD卡 启动 开发环境 win10 64位 VMware Workstation Pro 16 ubuntu 22.04 -【迅为imx6q】开发板,…

【学习笔记】【Pytorch】三、常用的Transforms

【学习笔记】【Pytorch】三、常用的Transforms学习地址主要内容一、Transforms模块介绍二、transforms.ToTensor类的使用1.使用说明2.代码实现三、transforms.Normalize类的使用1.使用说明2.代码实现四、transforms.Resize类的使用1.使用说明2.代码实现五、transforms.Compose类…

IIC协议初识及OLED写入指令、数据和显示的代码实现

目录 一、IIC协议概述 二、IIC协议起始和终止信号 三、应答信号 四、数据发送的时序 五、OLED写入指令和数据 六、OLED显示一个点的思路 七、OLED显示一个点的代码 八、OLED列地址 九、OLED显示图片 一、IIC协议概述 1、IIC概述 IIC(集成电路总线&#…

UI设计师与UE设计师有什么区别?

设计在我们的生活中扮演着重要的角色,但是面对越来越多的专业术语和相近的岗位职责,人们总是困惑:明明是差不多的岗位,为什么要整那么多的词?其实,在它们神似的外表下,潜藏着巨大的差异&#xf…

虹科分享 | 实时操作系统INtime RTOS第7版功能更新介绍

INtime简介 INtime是专为基于PC的嵌入式解决方案而设计的可扩展实时操作系统,功能包括动态控制多个主机上多个节点(核心)上的进程,以及系统所有节点之间的丰富进程间通信,可应用于多核x86兼容处理器的非对称多处理(AM…

【阶段三】Python机器学习17篇:机器学习项目实战:随机森林回归模型

本篇的思维导图: 项目实战(随机森林回归模型) 项目背景 作为国家的支柱产业,房地产的稳定发展关乎国际民生。近几年,房地产价格飞速上涨,连创新高。在这种情况下研究房价的影响因素,具有重要的理论和现实意义。弄清影响房价的主要经济因素,探究我国房地产投资是…

calc()方法的使用

calc实现css中动态计算 环境 根据元素高度的变化,动态控制padding值 <marquee:name"up index"behavior"scroll"scrolldelay"30"direction"up"v-else-if"item.scrollPocition 3 ? true : false":style"{--positi…

核心乐理---五线谱基础

音符 音符的长度 音符的长度都是相对的定义 一般来说讲全音符设为一拍&#xff0c;但如果将二分音符设为一拍的话&#xff0c;全音符就是两拍 附点音符 可以在音符后跟上一个小点来改变音符的长度&#xff0c;如果一个音符后面跟了n个原点&#xff0c;它的长度就会变为原来的…

【学习记录】阿里云服务器+宝塔

环境&#xff1a;阿里云服务器&#xff0c;linux Centos系统 一、安装宝塔 参考链接&#xff1a;阿里云 ECS 服务器入门使用宝塔安装使用 1、进入云服务器控制台&#xff0c;打开远程连接 2、初次使用&#xff0c;可重置登录密码和连接密码 这是远程连接时需要输入的密码 这…

测试开发基础 | 计算机网络篇(二):物理层与数据链路层

计算机网络知识是自动化测试等技术基础&#xff0c;也是测试面试必考题目。霍格沃兹测试学院特别策划了本系列文章&#xff0c;将带大家一步步夯实计算机网络的基础知识。一、物理层由于物理层知识在互联网软件研发工作中用到的并不多&#xff0c;所以可以仅做一个简单的了解。…

Prompt: No !!!

Prompt is Not Good. Prompt 这个方法实际上并不是很好 Prompt 可以是in-context learning的一种。prompt-based learning has taken NLP by storm!! prompt-based的方法在NLP中引起风暴。但&#xff0c;Prompt-based的方法实际上不太行&#xff1a; 1. Inefficiency: The pro…

基于python的企业编码生成系统 (完整的代码+项目说明)

《企业编码生成系统》程序使用说明 在PyCharm中运行《企业编码生成系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&#xff0c;只需要输入对应的数字即可。 图1 系统主界面 具体的操作步骤如下&#xff1a;…

匿名内部类的理解(java + Android)

是不是有同学跟我一样学了知识&#xff0c;不使用&#xff0c;一段时间就忘了&#xff1f; 今天说说java的匿名内部类这个东西&#xff0c;今天就因为这个东西被程序媛欺负了&#xff0c;我心里难受啊。 匿名内部类的官方说法特别不容易理解&#xff0c;是从"有没有名字…

全网惟一面向软件测试人员的Python基础教程-在Python中如何把列表当成队列来进行使用?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…