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

      最后更新:2020-06-05 10:29:30 手机定位技术交流文章

      作者| cxuan

      源代码|程序员cxuan

      王晓曼

      前言

      我最近一直在写Spring的文章,只有Spring FrameWork的文章,从官方网站的介绍开始到对当前源代码的深入分析。主要有三个系列:

      官方网站初学者系列,Spring官方网站阅读笔记,这一系列的文章是开始使用Spring的唯一选择,也是后续源代码阅读的基础。《春季杂谈》系列讲座主要是一些补充内容,可以帮助大家更全面地学习春季的各种知识点。同时,他们也将分享一些源代码阅读技巧,个人学习经验等等。杂七杂八的谈话只是不知道放在哪里的文章,比如这篇文章。源代码分析系列,Spring源代码分析,目前正在创建的专栏,比较难学,而且因为作者写的比较好,估计大多数学生看起来会很难,但是如果能仔细阅读,收获绝对是巨大的!这篇文章的主要目的是教(bi)。

      从作者的实践经验来谈如何成为一个开源项目的贡献者。

      体验

      让我先谈谈我自己的经历。当我写最后一篇文章时,我发现Spring在实例化对象时有这样一个代码。在ORG中。春季框架。豆子。工厂。支持。构造函数解析器# ResolveConstructor参数方法:

      //本文不讨论技术细节,只对这个问题进行简单的解释,所以不相关的代码私有int resolve constructor(stringbeaname,rootboarddefinition mbd,bean wrapper bw,ConstructorArgumentValues cargs,ConstructorArgumentValues resolved values){//....(地图。条目<。整数,构造值。价值持有人>。条目:cargs . GetIndexedargumentValues . EntrySet){ int index = entry . GetKey;如果(索引& lt0){引发新的BeanCreatiOnException(mbd . GetResourceDescription,beanName,“无效的构造函数参数索引:“+索引”;}//这就是问题所在。minrofArgs){ minrofArgs = index+1;}/...在上面的代码中,变量minNrOfArgs是保存方法所需的最小参数数,但是index是下标索引,索引从0开始。如果有带下标n的元素,那么参数的最小数量应该是n+1,所以逻辑中的if是没有问题的,但是如果这个判断有问题,正确的方法应该是:

      if (index+1>。minrofArgs){ minrofArgs = index+1;对这个问题的第一反应是,我一定是姿势不对。错误的代码怎么会是代码呢?一定是我!

      调试

      接下来,我对这段代码做了一些不人道的调试。经过无数次调试,我发现这个地方有点不对劲!

      在确认了这个问题之后,我想思考的是如何将我的想法反馈给Spring,换句话说,如何为伟大的开源做出贡献?通常有两种方法可以达到这个目标:

      提交问题;;

      直接在GitHub上提交请求。

      这相当于点击GitHub下面红色框中的两个位置。

      如果您提交问题,这相当于向官方团队提交问题。这个问题可能是你在代码中发现了一个错误,或者你认为官方的方法不够好,你有更好的想法,等等。

      如果你感兴趣的话,你可以去看看春季的哪一期仍然开放。也许你能解决其中一个!

      如果你想提交公共关系,首先你必须将代码转移到你自己的GitHub,然后从你自己的GitHub签出到本地,在本地修改后提交到GitHub仓库,最后从你自己的GitHub启动公共关系到Spring的官方仓库。

      正如我所说的,很久以前我就已经把代码分支放到我的GitHub中了。

      上图中的第一个红色方框表示我的仓库来自Spring官方的分支,第二个红色方框表示我可以从这里向Spring官方提交一份公共关系。

      至于如何提交详细的公关,我们可以自己做。这里我们不做详细介绍。

      此外,说了这么多,让我给你看看我首先提交的问题。

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

      因为内容不长,所以我把原文直接放在下面:

      在构造求解器中:

      private int resolveConstructorArguments(字符串beanName,RootBeanDefinition mbd,BeanWrapper bw,ConstructorArgumentValues货物,ConstructorArgumentValues resolved values){ TypeConverter customConverter = this . bean factory . GetCustomTypeConverter;//...(地图。条目<。整数,构造值。价值持有人>。条目:cargs . GetIndexedargumentValues . EntrySet){ int index = entry . GetKey;如果(索引& lt0){引发新的BeanCreatiOnException(mbd . GetResourceDescription,beanName,“无效的构造函数参数索引:“+索引”;}如果(索引> 1。minrofArgs){ minrofArgs = index+1;}//....}//....返回minNrOfArgs我假设解析构造文档的方法是解析XML文件中的构造器参数,并返回构造器所需的最小参数数。但是如果第一个参数是自动连接的,第二个参数是通过XML文件配置的,那么这个方法就不能很好地工作。

      示例:

      公共类FactoryObject {公共DmzService getDmz(字符串名称,整数年龄,日期生日,订单服务订单服务){公共DmzService getDmz(订单服务订单服务,字符串名称){返回新的DmzService(订单服务,名称);} } & lt?xml版本=“1.0”编码=“UTF-8”?>。& ltbeans xmlns = ' http://www . spring framework . org/schema/beans ' ' xmlns:xsi = ' http://www . w3 . org/2001/XMLSchema-instance ' ' xsi:schema location = ' http://www . spring framework . org/schema/beans/spring-beans . xsd ' ' default-autowire = ' constructor ' ' & gt;& ltbean id = ' FactoryObject ' ' class = ' com . dmz . spring . first . instantiation . service . FactoryObject ' '/& gt。& ltbean class = ' com . dmz . spring . first . instantiation . ServiCe . OrderServiCe ' ' id = ' OrderServiCe ' '/& gt。& ltbean id =“DmZ服务”工厂-bean =“Factoryobject”工厂-方法=“GetDmZ”& gt。& lt构造函数-arg索引=“1”值=“dmz”/& gt。& lt/bean>。& lt/beans>。resolveConstructorArguments方法将返回1,但正确答案是2。

      我认为问题的出现是因为这个判断:

      if (index>。minrofArgs){ minrofArgs = index+1;}最好把它改成这样。

      if (index + 1>。minrofArgs){ minrofArgs = index+1;} s思路

      当我提交问题时,我主要遵循以下思路:

      首先,输出有问题的代码;

      为了描述一个具体的问题,我将通过一个例子直接描述它。

      给出你的建议。

      最近几天,我研究了其他人提交的问题。相比之下,我认为至少还应该补充一点:它应该明确指出问题的哪个版本有问题。

      -7。-遇到的问题

      1.担心制定自己的目标

      虽然我已经调试了无数次代码,但我还是不知道。毕竟我是那么谨慎(蔡)的一个人,如果有人喷我怎么办?我不知道你是否这样认为,不管怎样,那是我当时的想法。如果你这样认为,我建议你去看看别人提交的问题。搜索标准如下:

      is:封闭标签:“”状态:无效“”

      我想如果你多看几眼,你自然会有信心!

      2、不知道如何提交

      每个开源项目,只要作者希望项目变得越来越好,都会详细解释如何为项目做出开源贡献。春天当然也不例外。这是一个提交问题的例子。当您单击“新建问题”时,将出现下图:

      上图左侧的方框清楚地告诉您提交问题时应该注意的事项:

      首先,您应该去堆栈溢出询问问题。

      如果是一个bug,你应该指定版本和你想做什么。

      如果它是一个增强,提供上下文并清楚地描述问题;

      对于同样的问题,问题和公关最好只提交一个,因为GitHub认为它们是一样的。如果你不确定,先提交一个问题。

      右上角有更详细的文档供参考。

      3.英语

      正如你应该看到的,整个问题是用英语写的,所以如果英语不好怎么办?这一次会拿出我们的神器:

      嗯,这是一本字典。我习惯于使用一本合适的字典。我建议英语不好的学生可以先用中文写完整篇文章。如果你真的对英语一无所知,你可以通过翻译软件把它一句一句地翻译出来,然后贴在GitHub上。但是不要用中文,就像下面这个家伙:

      发布链接:https://github . com/spring-project/spring-framework/pull/25127

      这样的问题将被直接标记为无效。想想吧。你不能学英语。你希望我们的外国朋友懂中文吗?是不是因为五千年的中国文化不够博大精深?

      4、担心问题描述不清楚

      事实上,这个问题源于糟糕的英语。因为英语不好,我自然会担心他是否能理解我写的东西。我的建议是用你测试的代码来描述这个问题。你不必担心其他人不能理解你写的代码,就拿我的问题流程为例。

      当您刚刚提交一个问题时,一个特殊的问题管理员(问题管理员)将使用等待分类标签来标记您提交的问题,以指示该问题处于待定状态。

      我后来提交的问题分配给了乔勒。你担心他看不懂密码吗?让我给你看两件事。

      -13岁。-你知道那个红盒子是什么意思吗?也就是说,他是我用问题代码找到的那个类的作者。

      看看另一个:

      也就是说,jhoeller自2003年以来一直是Spring项目的经理和发布经理。2003年,我还是一名小学生........

      所以,只要你稍微正常一点,人们基本上就能明白你的意思。

      建议

      事实上,从发现这个问题到最终提交这个问题大约一个星期之后,提交人一直在犹豫是否提交这个问题,因为上述问题,他一直在犹豫。

      但是当我下定决心去做的时候,花了几个小时。包括研究该问题提交的规则和编写该问题的英文版本。在我提交问题的第二天,问题就被立即处理了,乔勒在f9aae8d委员会接受了我的建议。

      所以我想说的是,

      如果你真的做到了,你总能找到解决任何问题的办法!

      但只要保持在空思考和犹豫,你总是会有很多问题。

      在林园,与其珍惜鱼,不如撤退并形成一张网。

      有了这篇文章,我鼓励大家!

      阿里云科学家入选HPCA名人堂。他是谁?

      屏保壁纸引发谋杀,三星手机瞬间变成砖块

      太可怕了!中央处理器已经成为黑客的帮凶

      加里·马库斯:因果熵理论的荒谬性及认知科学对人工智能的11点启示

      这10个云计算错误会毁了你的生意。

      浩普科技结合区块链产业发展趋势,推出了“浩普区块链合作伙伴”项目。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/7713.html

          热门文章

          文章分类