解析Spring确定构造方法的过程

news2024/11/24 3:25:07

解析Spring确定构造方法的过程


文章目录

  • 解析Spring确定构造方法的过程
  • 前言
  • 一、三个普通构造函数解析过程
  • 二、加@Autowired 和 只有一个有参构造函数解析过程
  • 总结


前言

每次都是从关键代码进行定位解析,希望大家对Spring源码有一定的了解再看,本篇主要解析determineConstructorsFromBeanPostProcessors(beanClass, beanName);


一、三个普通构造函数解析过程

类:AbstractAutowireCapableBeanFactory 方法:createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
有一个A类 B类(类上加了@Component ) C类(类上加了@Component ) 如下图:
在这里插入图片描述
开始解析 定位到关键代码 并进入

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
这里只有AutowiredAnnotationBeanPostProcessor#determineCandidateConstructors的方法有实现,如下图所示:
在这里插入图片描述
在这里插入图片描述
继续往下看,会执行到这个else if 并赋值 因为是循环所有的构造 所以这是第一个无参构造,其它则进不了这个赋值过程
在这里插入图片描述
循环完成之后 代码如下 判断candidates 里面是否已经有了Constructor方法 只有在@Autowired时才会有值
在这里插入图片描述

继续流程 第一个红框代表只定义了一个有参的构造函数 ;第二个 普遍情况;第三个红框就返回对应的内容 一般返回null 或者 有值得构造列表
在这里插入图片描述
回到之前得主流程
在这里插入图片描述
因为返回null,并其它配置未配置过,所以会走第二个框得逻辑
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好了 这个就解析完了

二、加@Autowired 和 只有一个有参构造函数解析过程

其实在第一步推断出来得都是存在构造函数得列表,代码自己进去看看 直接开始解析此行代码下面的代码
在这里插入图片描述
在这里插入图片描述
autowireConstructor(beanName, mbd, ctors, null) 很麻烦 阅读后 后面的几种方法 也可以迎刃而解,所以这是重点方法; 这里面比较重要的点就是是否设置了宽松模式 以及排序 以及计算构造方法差值等 定位到关键代码,关键代码上方的代码都是赋值校验及缓存等;
在这里插入图片描述
首先是排序,根据是否为public 及 里面的参数个数进行决定,代码如下:
在这里插入图片描述
继续往下定位到核心代码,这里会循环拿到每个参数的值 是否可赋值 可赋值的在Spring中拿出来(未创建的走创建流程既getBean),如果拿不到抛异常 跳过此构造函数,如下图
在这里插入图片描述
第一个框是计算差异值的 受接口 父类的影响 第二个框第一个构造函数会进入,第三个只是为宽松模式做提前铺垫的,如果不是宽松模式,下方会有校验 进行报错。所以综上所述 排完序的第一个构造函数很有可能将会成为确定的构造函数,但也有例外比如第一个构造函数有个接口作为参数,则不确定性就会增大 所以差异值也会变大,看第二个框 比较 谁小 谁有优势,所以在宽松模式 代码如下第二张图
在这里插入图片描述
在这里插入图片描述
从上图第一个框就可以看出 Spring作者考虑的很周全,应对特殊情况的代码,这里大家能想到应对那种情况的吗,欢迎评论区留言

总结

autowireConstructor(beanName, mbd, ctors, null) 里面代码还是比较重要的

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

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

相关文章

IP子网划分【专题突破】

1、IP地址基础 IPv4地址是32位,采用点分十进制方式表示,其次必须掌握二进制的转换。 IPv6地址是128位,采用冒号分隔的十六进制表示方法。 2、IP地址的分类 RFC1918规定的私有地址 A类地址范围:10.0.0.0-10.255.255.255(1个A类…

在idea中不经意把模块remove moudle后在delete删除了怎么办

删除模块 我先演示一遍删除操作,看看您是不是这样误删的。 这时候模块已经被删除了 恢复模块 接下来进行恢复 File → Local_History → Show_History 打开历史记录 通过时间线或者找到要恢复的文件一步一步查找,找到要恢复的位置即可 以下位…

【python】进阶--->网络编程(一)

一、网络编程 网络 : 为了联络多方然后进行通信,将数据从一方传递给另一方. 网络协议 : 不同计算机只需要通过联网,那么就可以相互进行传递数据,那么不同种类的计算机之间就和不同语言的人之间沟通一样,需要一种大家都认可都遵循的协议即可. 那么计算机都遵循的网络通信协议叫…

二维码智慧门牌管理系统升级的重要性与功能

文章目录 前言一、系统的双重作用二、系统的挑战与未来发展三、结论与未来展望四、为未来智慧管理铺平道路 前言 随着科技不断进步,智能化管理已贯穿于我们日常生活的各个领域。其中,二维码智慧门牌管理系统升级解决方案因其独特的考核评估系统和实用功…

鸿蒙、ChatGPT 入选全球十大工程成就丨 RTE 开发者日报 Vol.111

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

2023.12.18 关于 CentOS7 安装 Redis5

目录 安装步骤 创建符号连接 修改配置文件 启动 redis 服务器 停止 redis 服务器 安装步骤 CentOS7 的 yum 仓库中,redis 的默认版本为 3 系列为了 能让 CentOS7 安装上 Redis5,此处我们需要安装额外软件源 1、安装额外软件源 yum install cento…

Python与Flink的完美融合:合流基本操作解析

更多资料获取 📚 个人网站:ipengtao.com Apache Flink 是一个流式处理框架,支持复杂事件处理和大规模数据分析。在 Flink 中,合流(Join)是一种常见的操作,用于将两个或多个流中的数据按照指定条…

vue 点击添加多个input且与v-model绑定

<template><div><tr v-for"(item, index) in formArr" :key"index"><td><el-input v-model"item.value1" placeholder"请输入" /></td><td><el-input v-model"item.value2" p…

【EasyExcel实践】万能导出,一个接口导出多张表以及任意字段(可指定字段顺序)-简化升级版

文章目录 前言正文一、项目简介二、核心代码2.1 pom.xml 依赖配置2.2 ExcelHeadMapFactory2.3 ExcelDataLinkedHashMap2.4 自定义注解 ExcelExportBean2.5 自定义注解 ExcelColumnTitle2.6 建造器接口 Builder2.7 表格工具类 ExcelUtils2.8 GsonUtil2.9 模版类 ExportDynamicCo…

金蝶云星空业务对象标识是否可以修改

文章目录 金蝶云星空业务对象标识是否可以修改业务背景说明根本原因开发规范终极临时解决方案 金蝶云星空业务对象标识是否可以修改 业务背景 开发人员不注意&#xff0c;新建业务对象或者直接扩展标准产品的业务对象就直接操作保存&#xff0c;然后再次打开界面发现标识已经…

数字生态文明:构建可持续发展的未来

数字技术的快速发展给人类社会带来了巨大的变革,同时也对生态环境产生了深远的影响。在这个背景下,数字生态文明的概念应运而生,它强调在数字时代实现经济、社会和环境的协调发展,构建可持续的未来。 一、数字生态文明的内涵 数字生态文明是指在数字经济发展过程中,遵循…

【数据库】函数依赖

什么是函数依赖 就是在具体的表中/问题中&#xff0c;哪个属性决定另外几个属性。 A属性值相同的时候&#xff0c;能否决定唯一的B U {学号&#xff0c;姓名&#xff0c;年龄&#xff0c;班号&#xff0c;班长&#xff0c;课号&#xff0c;成绩} 就有&#xff1a; ‘学号’ 决…

vxe-table 修改[表尾数据]footer的高度

下面展示一些 内联代码片。 <style> .vxe-table--render-default.size--small .vxe-footer--column.col--ellipsis {height: 20px; } </style>

ElementUI中修改el-table的滚动条样式

注意&#xff1a;本文仅基于webkit引擎浏览器&#xff1b; 如果是火狐浏览器&#xff0c;则是-moz-&#xff1b; 部分webkit引擎浏览器&#xff1a;Google Chrome谷歌浏览器、Safari浏览器、搜狗高速浏览器、QQ浏览器、360极速浏览器等… 当内容超出容器时会出现滚动条&#…

Modbus转Profinet网关的解决方案推荐

现场问题&#xff1a;现场PLC的上端接的是显示器&#xff0c;下端接多台温湿度仪器&#xff0c;但是温湿度仪器的数量超过PLC的插槽限制了&#xff0c;导致项目无法正常完工。 解决方案&#xff1a;在PLC的下端加入Modbus转Profinet网关&#xff08;XD-MDPN100/2000&#xff09…

为外来邮件设置警示消息

大家好&#xff0c;才是真的好。 新版本发布&#xff0c;我们总有很多新内容要讲。其中最重要的就是新功能的测试和介绍。今天我们就来介绍Domino 14中设置外来邮件的提示文本信息。 如果你的Domino服务器环境已经升级到14.0&#xff0c;就可以在服务器的配置文档当中&#x…

怎么放大图片保持清晰度?

怎么放大图片保持清晰度&#xff1f;在生活中我们可能会保存各种各样的图片&#xff0c;但有时保存下来的图片可能太小了&#xff0c;尺寸和像素都不符合自己的要求&#xff0c;当图片像素和尺寸都过小会带来各种缺点&#xff0c;首先就是当我们看图片的时候会感觉它很模糊&…

Hal深入实战/perfetto-systrace实战/SurfaceFlinger合集-安卓framework开发实战开发

背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01; 下面来介绍一下新的framework专题halperfettosurafceflinger&#xff0c;这个专题主要就是分为3大块&#xff0c;但是彼此直接又是相互关联的。 比如surfaceflingre模块深入分析需要用到hal相关的模块&#xff…

3分钟搞懂北交所交易规则和手续费

北交所是2021年11月15日正式开市的新设证券交易所&#xff0c;主要承接全国股转系统精选层挂牌公司的平移上市&#xff0c;以及符合条件的新股上市。 1、北交所的交易规则&#xff1a; &#xff08;1&#xff09;北交所实行30%的涨跌幅限制&#xff1b; &#xff08;2&#…

虚拟机无法进入系统问题

概述 客户在华为云平台上创建了两台虚拟机并部署aarch64 V10 OS&#xff0c;2021-10-28其中一台虚拟机业务出现异常&#xff0c;运维重启虚拟机后系统进不去&#xff0c;左上角光标闪烁&#xff0c;接着重启另一台虚拟机同样起不来&#xff0c;现象一致。 分析 通过分析现场…