怒肝 8 个月源码,我成为了 Spring 开源贡献者

作者 | cxuan 

来源 | 程序员cxuan

责编| 王晓曼

前言

我最近一直在写Spring的文章,而且仅仅是 Spring FrameWork 的文章 ,从最开始的官网入门到现在源码的深度分析。主要就是三个系列:

  • 官网入门系列,Spring官网读书笔记,这一系列的文章是入门Spring的不二之选,也是后续源码阅读的基础。

  • 杂谈系列,Spring杂谈,这主要是一些补充内容,可以帮助大家更全面学习到Spring中的各个知识点,同时也会分享一些源码阅读技巧,个人学习心得之类的,杂谈嘛,就是不知道放哪里的文章都打算放这里,比如这篇文章。

  • 源码分析系列,Spring源码解析,该专栏目前正在创作中,相对而言学习难度比较大,而且因为笔者写的比较细,估计大部分同学看起来会很费劲,不过如果你能认真看完,收获绝对巨大!

本文的主要目的是教(zhuang)学(bi)。

就是从笔者的实际经验出发,谈一谈怎么成为一个开源项目的贡献者。

经历

我先说说我自己的经历吧,在创作上篇文章的时候,笔者发现 Spring 在实例化对象的时候有这么一段代码,在org.springframework.beans.factory.support.ConstructorResolver#resolveConstructorArguments方法中:

// 本文不探讨技术细节,只是为了简单说明这个问题,所以省略无关代码 
private int resolveConstructorArguments(String beanName, RootBeanDefinition mbd, BeanWrapper bw,ConstructorArgumentValues cargs, ConstructorArgumentValues resolvedValues) {// ....for (Map.Entry<Integer, ConstructorArgumentValues.ValueHolder> entry : cargs.getIndexedArgumentValues().entrySet()) {int index = entry.getKey();if (index < 0) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Invalid constructor argument index: " + index);}// 问题就出在这里if (index > minNrOfArgs) {minNrOfArgs = index + 1;}// ..... 

上述代码中,minNrOfArgs 这个变量就是保存方法需要的最小参数个数,但是index是下标索引,索引是从0开始的,如果有下标为n的元素,那么最小的参数个数应该是n+1嘛,所以if中的逻辑是没有问题的,但是if这个判断是有问题的,正确的做法应该是:

if (index+1 > minNrOfArgs) {minNrOfArgs = index + 1;
}

这个问题的时候,第一反应就是肯定是我的姿势不对,错的怎么可能是代码,肯定是我!

调试

接下来,我就对这段代码进行了惨无人道的调试,在无数次 debug 后,我发现,这个地方确实有问题!

在确认了这个问题之后,我要思考的就是怎么把自己的想法反馈给 Spring ,换而言之,怎么为伟大的开源来做贡献呢?正常来要达到这个目的有两个方式:

  • 提交 issue;

  • 直接在 GitHub 上提交 PR(pull request)。

对应的就是在 GitHub 上点击下图红框选中的两个位置。

如果是使用提交 issue 的方式,相当于给官方团队提交了一个议题,这个议题可能是你发现代码中的某个 bug,也可能是你觉得官方的做法不够好,你有更好的想法等等。

感兴趣的话,大家可以去看看 Spring 中现在有哪些还未关闭的 issue,说不定其中一个你就能解决呢!

如果要采用提交 PR 的方式的话,首先你得将代码 fork 到自己的 GitHub 中,然后再从自己的 GitHub 检出到本地,在本地做完修改后,提交到 GitHub 仓库中,最后从自己的 GitHub 向 Spring 官方仓库发起一个 PR。

像我的话很早就已经将代码 fork 到了自己 GitHub。

上图中的第一个红框,说明我这个仓库是从 Spring 官方 fork 过来的,第二个红框就是可以从这里向 Spring 官方提交一个 PR。

关于详细的如何提交 PR,大家可以自行百度,这里不做详细的介绍了。

另外,说了这么多,先给大家看下我提交的 issue 吧。

issue链接:https://github.com/spring-projects/spring-framework/issues/25130

因为内容也不长,所以我这里把原文就直接放到下面了:

In ConstructorResolver:

private int resolveConstructorArguments(String beanName, RootBeanDefinition mbd, BeanWrapper bw,ConstructorArgumentValues cargs, ConstructorArgumentValues resolvedValues) {TypeConverter customConverter = this.beanFactory.getCustomTypeConverter();// ...for (Map.Entry<Integer, ConstructorArgumentValues.ValueHolder> entry : cargs.getIndexedArgumentValues().entrySet()) {int index = entry.getKey();if (index < 0) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Invalid constructor argument index: " + index);}if (index > minNrOfArgs) {minNrOfArgs = index + 1;}// ....}
// ....return minNrOfArgs;
}

I assume that method  resolveConstructorArguments is to resolve contructor arguments in the XML file and return the minimum number of parameters required by contructor. But if the first parameter is autowired , the second parameter  is config by XML file,the method will not work well.

Example:

public class FactoryObject {public DmzService getDmz(String name, int age, Date birthDay, OrderService orderService) {public DmzService getDmz(OrderService orderService,String name) {return new DmzService(orderService,name);}}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"default-autowire="constructor"><bean id="factoryObject" class="com.dmz.spring.first.instantiation.service.FactoryObject"/><bean class="com.dmz.spring.first.instantiation.service.OrderService" id="orderService"/><bean id="dmzService" factory-bean="factoryObject" factory-method="getDmz"><constructor-arg index="1"  value="dmz"/></bean></beans>

The resolveConstructorArguments method will return 1,but correct answer is 2.

I think the problem arises because of this judgment:

if (index > minNrOfArgs) {minNrOfArgs = index + 1;
}

It might be better to change it to look like this.

if (index + 1 > minNrOfArgs) {minNrOfArgs = index + 1;
}s

思路

我在提交 issue 时主要是按照这种思路:

  • 首先摆出有问题的代码;

  • 描述具体的问题,我是直接通过一个例子来描述的;

  • 说出自己的建议。

这几天我又多看了看别人提交的issue,对比起来,我觉得至少应该还要添加一点:应该要明确的指出具体哪个版本上出现的问题。

碰到的问题

1、担心闹乌龙

虽然在之前我已经调试过了无数次代码,但是心里还是没谱啊。毕竟我这么谨(cai)慎(ji)的一个人,万一被人喷了怎么办?不知道你会不会这么想,反正我当时就是这么想的,如果你是这么想的,建议你去看看别人提交的 issue。搜索条件如下:

is:closed label:"status: invalid"

我觉得你看几个,自然就有信心了!

2、不知道要怎么提交

每个开源的项目,只要作者希望这个项目越来越好的话,都会详细的说明如何给这个项目做开源贡献,Spring肯定也不例外,这里还是以提交 issue 为例,当你点击 New issue 的时候会出现下面这张图:

在上图左边的框里很明确的告诉了你提交issue应该要注意什么:

  • 首先,你应该要去 Stack Overflow 提问;

  • 如果是 bug,你应该要指明版本以及你想要做什么;

  • 如果是一个增强的话,要提供上下文并且描述清楚问题;

  • 同一个问题,issue 跟 PR 最好只提交一个,因为 GitHub 认为它们是一样的,如果你还不能确定的话,先提交一个 issue。

而右上角还有更加详细的文档可供参考。

3、英文

大家应该看到了,整个 issue 都是用英文写的,那么英文不好怎么办呢?这个时候就要掏出我们的神器了:

嗯,就是词典,笔者习惯是使用有道词典。我建议英文不好的同学可以这样,先将整个 issue 用中文写好,如果你真的英文一窍不通的话,可以直接通过翻译软件逐句翻译,然后粘贴到 GitHub 上。但是千万千万不要使用中文,就像下面这个哥们:

issue 链接:https://github.com/spring-projects/spring-framework/pull/25127

像这种 issue 是会被直接打上 invalid(不合格)标签的,你就想想吧,你学不会英文,你指望我们的外国朋友能看懂中文嘛?是我中华上下五千年的文化不够博大精深吗?

4、担心问题描述的不清楚

其实这个问题就是因为英文不好衍生出来的。因为英文不好,自然就会担心我写的东西他能不能看懂呢?我的建议就是,结合你测试的代码去描述问题。你不用去担心别人看不懂你写的代码,就以我那个 issue 的处理流程为例吧。

在你刚刚提交 issue 时,有专门的 issuemaster (issue管理员)会给你提交的 issue  打上一个 wait-for-triage 的标签,标志这个 issue 是待处理的。

随后我提交的这个 issue,就被指派给了 jhoeller 。你要担心他看不懂代码吗?给你看两个东西吧。

你知道那个红框是啥意思吗?就是说我发现的那个有问题代码的类的作者就是他。

再看一张:

就是说,jhoeller 从 2003 年开始就已经是 Spring 这个项目的管理者以及发布经理了。2003 年,我还是一个小学生........

所以啊,只要你稍微正常点,基本上人家都能 get 到你的点。

建议

其实笔者从发现这个问题到最终提交 issue 大概经过了一周时间,期间一直在犹豫要不要提交 issue,就是因为上面提到的几个问题,一直踌躇不前。

但是等我下定决心要去做这件事的时候总共就花了几个小时的时间。包括研究issue 提交的规则以及写一篇英文版的 issue,并且我提交 issue 的第二天就马上被处理了,并且 jhoeller 在 f9aae8d 这个 commit 中已经接受我的建议。

所以我要说的就是,

真正动手的话,不管什么问题总能找到解决方案!

而只是停留在空想、在踌躇,你永远有一堆问题。

临渊羡鱼,不如退而结网。

以此文与君共勉!

推荐阅读

  • 云计算,巨头们的背水一战

  • 整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划

  • 借助大数据进行社交媒体营销,企业们得这么玩!

  • 追忆童年,教你用Python画出儿时卡通人物

  • AI 终极问题:我们的大脑是一台超级计算机吗?

  • 公链的历史交叉口:PoS还能走多远?

真香,朕在看了!

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

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

相关文章

HTTPS配置过程

该文章借鉴于博主小东很不戳 先在自己项目中根目录下生成数字证书 生成命令如下&#xff1a;keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore sang.p12 -validity 365 命令解释 • -genkey表示要创一个新的密钥。 • alias表示 keystore 的别名。…

汇报时,如何让老板快速抓住重点?—— 黄金三步法

阿里妹导读&#xff1a;对事物的归类分组是我们人类的天性&#xff0c;我们的大脑会自动将发现的所有事物以某种持续组织起来。但如何组织才能帮助我们解决工作和生活中出现的各种复杂问题&#xff1f;今天&#xff0c;我们请阿里高级技术专家张建飞分享他的黄金三步法。 我们…

Nacos 集群 Nginx MySql SpringBoot2.x 微服务_04

接上一篇&#xff1a; Nacos 集群整合 Nginx 实现反向代理、负载均衡_03 文章目录一、配置规则1. 域名登录nacos2. 测试验证二、SpringBoot2.x 微服务2.1. 依赖引入2.2. bootstrap.yaml配置2.3. 测试类三、测试验证3.1. 启动项目3.2. 验证一、配置规则 1. 域名登录nacos 使用…

Serverless 实战 —— 快速搭建 SpringBoot 应用

前言 首先介绍下在本文出现的几个比较重要的概念&#xff1a; 函数计算&#xff08;Function Compute&#xff09;: 函数计算是一个事件驱动的服务&#xff0c;通过函数计算&#xff0c;用户无需管理服务器等运行情况&#xff0c;只需编写代码并上传。函数计算准备计算资源&am…

人才缺口40万,摆地摊也没有它挣钱,这个神仙职业今年太火了!

当你学习编程时&#xff0c;最先被困扰在哪一步&#xff1f;是不是很容易陷入在语法之类的细节而忽视基础概念&#xff1f;解决当前任务的最佳方法是什么&#xff1f;在多种编程语言之间来回切换&#xff0c;却感觉不到效率的提高&#xff1f;0 基础学习编程&#xff0c;最先入…

首次公开 | 淘系技术总监马鏖谈淘系用户增长

作者|马鏖 出品|阿里巴巴新零售淘系技术部 导读&#xff1a;近年来&#xff0c;关于用户流量的瓶颈让很多企业感到焦虑不安&#xff0c;互联网用户整体增速放缓&#xff0c;用户规模趋于饱和。同时&#xff0c;竞争个体成倍增长&#xff0c;流量资源争夺越发激烈&#xff0c;流…

JDK下载安装以及配置教程

截至2022年&#xff0c;JDK主流版本有JDK8跟JDK11 这里以JDK11为例 一、下载JDK 这里下载方法有两种 1.官网下载&#xff08;需要注册&#xff09; 网址&#xff1a;Java Downloads | Oracle 进入官网往下滑找到Java SE subscribers have more choices 根据提示框依次选择 弹出…

Tomcat10 端口修改 Linux 环境

文章目录1. 编辑文件2. 启动3. 验证1. 编辑文件 修改tomcat默认的端口&#xff0c;将默认端口8080修改为8090&#xff1a; cdapache-tomcat-10.0.10/conf/ vim server.xml 修改http协议端口 关键词&#xff1a;HTTP 修改前&#xff1a; 修改后&#xff1a; 2. 启动 cd ap…

月入过万的副业你要不要?不需要编程知识,不限男女,不限学历

01你知道做什么兼职最赚钱吗&#xff1f;你想拥有一份月薪过万的兼职工作吗&#xff1f;今天&#xff0c;我给你推荐的是看起来高大上&#xff0c;实则难度系数并不高的脚本创作&#xff01;你知道兼职脚本有多赚钱吗&#xff1f;普通程序员每天拿出2小时的时间&#xff0c;每个…

高德在提升定位精度方面的探索和实践

2019杭州云栖大会上&#xff0c;高德地图技术团队向与会者分享了包括视觉与机器智能、路线规划、场景化/精细化定位时空数据应用、亿级流量架构演进等多个出行技术领域的热门话题。现场火爆&#xff0c;听众反响强烈。我们把其中的优秀演讲内容整理成文并陆续发布出来&#xff…

Nginx 反向代理

文章目录一、软件安装验证1. Linux安装nginx2. Tomcat10 下载和配置 Linux 环境3. 服务器部署二、软件安装验证2.1. 启动tomcat2.2. nginx配置2.3. 关键配置2.4. 启动nginx2.5. 测试验证一、软件安装验证 1. Linux安装nginx https://blog.csdn.net/weixin_40816738/article/d…

收益 or 挑战?Serverless 究竟给前端带来了什么

导读&#xff1a;前端开发者是最早享受到 “Serverless” 好处的群体&#xff0c;因为浏览器就是一个开箱即用、甚至无需为计算付费的环境&#xff01;Serverless 把前端开发体验带入了后端&#xff0c;利用 FaaS 与 BaaS 打造一套开箱即用的后端开发环境。本文作者将从前端角度…

阿里云数据库四位小伙伴聚齐!共同开启生态合作新篇章!

随着用户的不断扩大&#xff0c;阿里云数据库能够帮助用户节省大量的基础运维工作&#xff0c;但是基于数据库业务侧的诊断、调优、护航等工作也是必不可少的。为了满足更多的市场需求&#xff0c;阿里云数据库团队发起数据库合作计划&#xff0c;招募具备优秀专业服务能力的伙…

一行代码引来的安全漏洞,就让我们丢失了整个服务器的控制权

来源 | 程序员石头责编| Carol封图 | CSDN 付费下载自视觉中国之前在某厂的某次项目开发中&#xff0c;项目组同学设计和实现了一个“引以为傲”&#xff0c;额&#xff0c;有点夸张&#xff0c;不过自认为还说得过去的 feature&#xff0c;结果临上线前被啪啪打脸&#xff0c;…

金融行业怎么用AI?蚂蚁金服是这么做的

伴随着金融科技的不断创新&#xff0c;人工智能技术已成为金融行业的重要驱动力。 在9月27日于杭州云栖小镇召开的云栖大会“金融智能”专场上&#xff0c;蚂蚁金服集团副总裁、AI首席科学家、达摩院金融智能负责人漆远博士做了开场演讲&#xff0c;向与会嘉宾分享了金融智能方…

SpringBoot 集成 MyBatisPlus 模板

<dependencies><!--对象、字符串等元素判断--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency><!--json处理--><depend…

贾扬清:把生命浪费在有意思的事情上

今天&#xff0c;是1024程序员节。在这个“攻城狮”自带光芒的日子里&#xff0c;阿里妹请来AI大神贾扬清&#xff0c;作为一位开发者&#xff0c;聊一聊他自己的开发者经历&#xff0c;希望对你有所启发。 贾扬清 阿里巴巴集团副总裁、高级研究员 阿里巴巴计算平台事业部总裁 …

MongoDB 入门,我是花了心思的

作者 | 沉默王二责编 | Carol封图 | CSDN 付费下载自视觉中国有时候不得不感慨一下&#xff0c;系统升级真的是好处多多&#xff0c;不仅让我有机会重构了之前的烂代码&#xff0c;也满足了我积极好学的虚荣心。你看&#xff0c;Redis 入门了、Elasticsearch 入门了&#xff0c…

码农节快乐|一个系统,高效解决复杂事件采集-计算-实时触达

PartI&#xff1a; 1024 今天是1024&#xff0c;一个特别的数字&#xff0c;比如某网站内容的解压密码通常都是1024&#xff0c;想求一个种子留言也是1024。1024是属于广大程序猿&#xff08;又称码农&#xff09;的节日&#xff0c;在这样一个节日里&#xff0c;各种“黑”程…

SpringBoot集成Myabtis

二、SpringBoot集成Myabtis 2.1. pom 依赖 <!--版本控制-><properties><java.version>1.8</java.version><oracle.version>11.2.0.3</oracle.version><mysql.version>8.0.20</mysql.version></properties><!--Mybat…