16. Spring源码篇之指定构造方法参数

简介

为什么讲这个,是因为在spring使用构造方法注入的时候会有大量的判断,是不是指定了参数。如果指定了参数就可以使用不同的构造方法去实例化Bean,本文将介绍如何指定参数

使用

首先看一个例子

// 定义三个构造函数
public class UserBean implements UserGenerics {public UserBean() {System.out.println("无参构造函数");}public UserBean(String name) {System.out.println("一个参数 name=" + name);}public UserBean(String name, int age) {System.out.printf("两个参数 name=%s,age=%s", name, age);}}public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();GenericBeanDefinition beanDefinition = new GenericBeanDefinition();// 注册一个userBean1,指定有一个参数beanDefinition.getConstructorArgumentValues().addGenericArgumentValue("shura");beanDefinition.setBeanClass(UserBean.class);context.registerBeanDefinition("userBean1", beanDefinition);// 注册一个userBean2,指定有两个参数GenericBeanDefinition beanDefinition2 = new GenericBeanDefinition();beanDefinition2.getConstructorArgumentValues().addIndexedArgumentValue(0, "shura");beanDefinition2.getConstructorArgumentValues().addIndexedArgumentValue(1, 20);beanDefinition2.setBeanClass(UserBean.class);context.registerBeanDefinition("userBean2", beanDefinition2);context.refresh();
}

执行上面代码输出

一个参数 name=shura
两个参数 name=shura,age=20

可见,源码肯定是有这些判断逻辑,我们要先了解有这种使用方式,在看源码才会清晰

先记住 ConstructorArgumentValues 类,后面源码会看到

private final Map<Integer, ValueHolder> indexedArgumentValues = new LinkedHashMap<>();// 保存private final List<ValueHolder> genericArgumentValues = new ArrayList<>();// 保存public void addGenericArgumentValue(Object value) {this.genericArgumentValues.add(new ValueHolder(value));
}public void addIndexedArgumentValue(int index, @Nullable Object value) {addIndexedArgumentValue(index, new ValueHolder(value));
}public void addIndexedArgumentValue(int index, ValueHolder newValue) {Assert.isTrue(index >= 0, "Index must not be negative");addOrMergeIndexedArgumentValue(index, newValue);
}private void addOrMergeIndexedArgumentValue(Integer key, ValueHolder newValue) {ValueHolder currentValue = this.indexedArgumentValues.get(key);if (currentValue != null && newValue.getValue() instanceof Mergeable) {Mergeable mergeable = (Mergeable) newValue.getValue();if (mergeable.isMergeEnabled()) {newValue.setValue(mergeable.merge(currentValue.getValue()));}}this.indexedArgumentValues.put(key, newValue);
}

指定构造参数的代码如上,就是保存到了indexedArgumentValues和genericArgumentValues,后面实例化Bean的时候就会用到,实例化Bean的源码后面文章分析


欢迎关注,学习不迷路!

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

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

相关文章

SLAM中提到的相机位姿到底指什么?

不小心又绕进去了&#xff0c;所以掰一下。 以我个人最直观的理解&#xff0c;假设无旋转&#xff0c;相机在世界坐标系的(5,0,0)^T的位置上&#xff0c;所谓“位姿”&#xff0c;应该反映相机的位置&#xff0c;所以相机位姿应该如下&#xff1a; Eigen::Matrix4d T Eigen::M…

Linux gdb调试的时候没有对应的c调试信息库怎么办?

gdb 调试报错&#xff1a;Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.6.x86_64 在centos7上面gdb调试程序时候&#xff0c;报错信息是&#xff1a; Missing separate debuginfos, use: debuginfo-install glibc-2.17-157.el7_3.5.x86_64 解决…

Redis学习笔记14:基于spring data redis及lua脚本ZSET有序集合实现环形结构案例及lua脚本如何发送到redis服务器

案例实现目标&#xff0c;一、实现一个环形结构&#xff0c;环形结构上节点有一个阀值threshold,超过阀值则移除分数score最低的成员&#xff0c;不足则将当前成员添加进环中&#xff0c;且确保成员不可重复&#xff1b;二、每次访问环中的数据都需要刷新key的过期时间&#xf…

亚马逊云科技AI创新应用下的托管在AWS上的数据可视化工具—— Amazon QuickSight

目录 Amazon QuickSight简介 Amazon QuickSight的独特之处 Amazon QuickSight注册 Amazon QuickSight使用 Redshift和Amazon QuickSightt平台构建数据可视化应用程序 构建数据仓库 数据可视化 Amazon QuickSight简介 亚马逊QuickSight是一项可用于交付的云级商业智能 (BI…

基于circle group的Reed-Solomon codes

1. 引言 Polygon团队Ulrich Habock等人2023年论文 Reed-Solomon codes over the circle group。 前序博客有&#xff1a; Plonky3 Mersenne素数域的Reed-Solomon codes设计 STARKs支持任意size的域&#xff0c;而不要求是椭圆曲线。STARKs中在选择域size时&#xff0c;越小…

Unity中 Start和Awake的区别

Awake和Start在Unity中都是MonoBehaviour脚本中的生命周期函数 Awake函数在游戏对象首次被加载时调用&#xff0c;在游戏对象初始化之前调用。 start函数在游戏对象初始化完成后调用&#xff0c;在update第一次执行前调用。 这两个函数在其生命周期内都只会调用一次&#xf…

替换sql,某个字段特定容

要替换wp_posts表中的wp_posts.post_content字段中的特定文本&#xff0c;可以使用MySQL的UPDATE语句和字符串替换函数来实现。 sql&#xff1a;语句 UPDATE 表名 SET 字段名 REPLACE(字段名, 原本内容, 替换内容);请注意&#xff0c;执行这样的操作可能会对数据库产生较大的…

verilog语言中条件编译ifdef的使用和例子

1条件编译ifdef 如果ifdef后面的参数被编译过&#xff0c;则编译ifdef语句后的内容&#xff0c;忽略else后面的内容&#xff0c;如果ifdef后面的参数没有被编译过&#xff0c;则编译else语句后面的内容&#xff0c;条件编译的范围以ifdef开始&#xff0c;以endif结束&#xff…

Android studio访问选程https接口(.crt handshake)

如果服务器是https的&#xff0c;访问受限怎么办&#xff1f;有两种方法&#xff0c;一种是接受一切证书个人官方正式非正式&#xff0c;当然这样就牺牲了安全性&#xff0c;网上方法很多&#xff0c;我现在教大家如何去验证crt文件 首先服务器是https的&#xff0c;必然有几个…

js数组操作——对象数组根据某个相同的字段分组

js数组操作——对象数组根据某个相同的字段分组 可以使用JavaScript的map()方法和reduce()方法来实现将数组中包含的数组对象的某个字段整合为数组的操作。具体实现方法如下&#xff1a; 假设有以下数组对象arr&#xff1a;let arr [{name: Tom, age: 18, hobbies: [reading,…

SpringBoot的启动流程

一、SpringBoot是什么&#xff1f; springboot是依赖于spring的&#xff0c;比起spring&#xff0c;除了拥有spring的全部功能以外&#xff0c;springboot无需繁琐的xml配置&#xff0c;这取决于它自身强大的自动装配功能&#xff1b;并且自身已嵌入Tomcat、Jetty等web容器&am…

redis+python 建立免费http-ip代理池;验证+留接口

前言: 效果图: 对于网络上的一些免费代理ip,http的有效性还是不错的;但是,https的可谓是凤毛菱角; 正巧,有一个web可以用http访问,于是我就想到不如直接拿着免费的HTTP代理去做这个! 思路: 1.单页获取ipporttime (获取time主要是为了后面使用的时候,依照时效可以做文章) 2.整…

windows环境搭建Zblog博客并发布上线公网可访问

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

总结 CNN 模型:将焦点转移到基于注意力的架构

一、说明 在计算机视觉时代&#xff0c;卷积神经网络&#xff08;CNN&#xff09;几十年来一直是主导范式。直到 2021 年 Vision Transformers (ViTs) 出现&#xff0c;这个领域才开始发生变化。现在&#xff0c;是时候采用受 Transformer 架构启发的基于注意力的模型了&#x…

Springboot+vue的机动车号牌管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的机动车号牌管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的机动车号牌管理系统&#xff0c;采用M&#xff08;model&#xff09…

项目九、无线组网

目录 1 配置AC使AP放出Wifi1.1 确保AP和AC三层互通且AP知道AC的IP1.1.1 配置管理SVI的IP1.1.2 该SVI配置DHCP下发IP给AP 1.2 AC为AP下发配置1.2.1 AC用哪个接口回复AP1.2.2 AC验证AP身份&#xff08;可以不认证&#xff09;1.2.3 配置ssid 文件确定Wifi名称1.2.4 配置security …

Mac开发指南

文章目录 1 前期准备1.1 brew1.2 tmux 1 前期准备 1.1 brew 用于下载软件 ubuntu用apt-get mac用brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"1.2 tmux

华纳云:租用的服务器连接超时怎么办?

服务器连接超时可能由多种原因引起&#xff0c;解决问题的方法取决于具体的情况。以下是一些常见的原因和相应的解决方法&#xff1a; 网络问题&#xff1a; 检查本地网络&#xff1a; 确保本地网络连接正常&#xff0c;尝试访问其他网站或服务&#xff0c;检查是否存在网络问题…

pnpm的安装及其使用

1、pnpm是什么 pnpm &#xff08;performant npm&#xff0c;意思是高性能的 npm&#xff09;是 Node.js 的替代包管理器。它是 npm 的直接替代品&#xff0c;速度更快、效率更高。为什么效率更高&#xff1f;当你安装一个包时&#xff0c;pnpm 将它保存在你机器上的一个全局存…

Java后台防止请求重复提交,拦截器+注解实现防止表单重复提交

一、前言 由于网络原因&#xff0c;用户操作有误&#xff08;连续点击两次以上提交按钮&#xff09;&#xff0c;或者页面卡顿等原因&#xff0c;可能会出现请求重复提交&#xff0c;造成数据库保存多条重复数据。后端实现拦截器防重。 那么如何防止请求重复提交呢&#xff1f…