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

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 时主要是按照这种思路

  1. 首先摆出有问题的代码

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

  3. 说出自己的建议

这几天我又多看了看别人提交的issue,对比起来,我觉得至少应该还要添加一点

  • 应该要明确的指出具体哪个版本上出现的问题

碰到的问题

担心闹乌龙

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

is:closed label:"status: invalid"

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

不知道要怎么提交

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

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

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

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

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

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

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

英文

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

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

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

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

担心问题描述的不清楚

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

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

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

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

再看一张

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

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

给你的建议

其实笔者从发现这个问题到最终提交 issue 大概经过了一周时间,期间一直在犹豫要不要提交 issue,就是因为上面提到的几个问题,一直踌躇不前。但是等我下定决心要去做这件事的时候总共就花了几个小时的时间。包括研究issue 提交的规则以及写一篇英文版的 issue。并且我提交 issue 的第二天就马上被处理了,并且jhoeller在 f9aae8d 这个 commit 中已经接受我的建议。

所以我要说的就是,

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

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

临渊羡鱼,不如退而结网

以此文与君共勉!

微服务把我坑了

如何降低程序员的工资?

程序员,你得选准跑路的时间!

两年,我学会了所有的编程语言!

一直CRUD,一直996,我烦透了,我要转型

字节码万岁!

上帝托梦给我说:一切皆文件

Javascript: 一个屌丝的逆袭

Node.js :我只需要一个店小二

我是一个线程

TCP/IP之大明邮差

一个故事讲完Https

CPU 阿甘

人大金仓数据库Kingbase FlySync同步程序安装 Kingbase FlySync同步程序(以下简称 KFS)是面向异地容灾、数据集中共享的场景推出的具备在异构数据平台间实现实时、增量数据同步的工具类产品,主要采用了物理日志解析技术,帮助用户解决不同数据平台的数据间可实现任意方向实时移动流转的问题,并保证此过程中数据不丢失,状态可监控,流转数据量可统计。KFS 需要安装的主要组件有 2 个,分别是后端同步程序和管理控制平台,另外KFS的部署方式也有2种,为分离部署何集中部署•集中部署:KFS与数据库部署在同一机器上。 阅读详情

相关推荐

HFSS新手避坑指南:从零搭建T形波导功分器(含参数扫描与优化实战)

本文为HFSS新手提供T形波导功分器设计的详细指南,涵盖基础设置、建模技巧、参数扫描与优化实战。重点解析内场分析中的常见陷阱,如单位设置、波端口定义和布尔运算错误,并分享优化设计的关键步骤,帮助工程师快速掌握HFSS在微波器件设计中的应用。

weixin_27442001的博客 138

Spring Boot笔记雷丰阳

一、Spring Boot 入门 1、Spring Boot 简介 简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案; 2、微服务 2014,martin fowler 微服务:架构风格(服务微化) 一个应用应该是一组小型服务;可以通过HTTP的方式进行互通; 单体应用:ALL IN ONE 微服务:每一个功能元素最终都是一个可独立替换和...

reddy528的博客 2002

手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

数字IC后端设计培训教程之手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

weixin_37584728的博客 2937

雷神(雷丰阳)SSM--Spring、SpringMVC、MyBatis。思维导图、印象笔记、课堂资料

雷神(雷丰阳)SSM

jinjinbu的博客 1105

修复zookeeper未授权访问漏洞

【代码】修复zookeeper未授权访问漏洞。

qq_28392947的博客 4068

模拟IC设计笔记:拆解一个经典的时钟占空比校正(DCC)电路模块,从理论到SPICE仿真

本文深入解析了时钟占空比校正(DCC)电路在模拟IC设计中的关键作用,特别是在高速ADC应用中。通过晶体管级拆解,详细介绍了基于电荷泵和积分器的模拟反馈型DCC电路设计,包括占空比检测、误差放大与校正执行单元的实现。文章还提供了SPICE仿真验证方法,确保电路在100MHz时钟下的稳定性和性能。

weixin_33725722的博客 428

【雷丰阳SSM基础】【Spring】【01】Spring概述

持续学习&持续更新中… 守破离 【雷丰阳SSM基础】【Spring】【01】Spring概述_IoC与AOP简介Spring是什么Spring的优良特性Spring的模块划分IoC与AOP简介参考 学习Spring核心关注IoC和AOP Spring是什么 Spring是一个开源的IoC(DI)和AOP容器框架,容器可以管理所有的组件(具有功能的类习惯上称之为组件)。 Spring为简化企业级开发而生,为JavaEE开发带来了春天(Spring)。 使用Spring,JavaBean就可以.

Keep Reading Keep Writing Keep Thinking 630

SAP 财务快速记账之--科目分配模型(Account assignment model )

SAP FICO 运维解决方案

lijinbao171022的博客 1768

springboot3学习笔记

1.定义自己的starter包,引入spring-boot-starter基础依赖2.开发主要功能,并引入相关依赖2.1 将属性类与配置文件前缀绑定@ConfigurationProperties(prefix = "robot") //此属性类和配置文件指定前缀绑定@Component@Data2.2 导入配置处理器,配置文件自定义的properties配置都会有提示。

weixin_47114534的博客 2264

SAP MM模块后续借记、后续贷记、贷方凭证简介

在SAP系统中,后续借记、后续贷记和贷方凭证是处理供应商发票、采购和付款过程中常见的财务交易。

我小时候很黑的博客 3270

CDD数据库文件制作(三)——服务配置(0x10)

根据诊断调查表进行每一步配置的详细操作,与背后逻辑解释 1.会话切换配置 1.1.根据诊断调查表进行信息提取(0x1001) 1.2.会话转换配置(0x1001) 1.3.根据诊断调查表进行信息提取(0x1002) 1.4.会话转换配置(0x1002) 1.5.根据诊断调查表进行信息提取(0x1003) 1.6.会话转换配置(0x1003) 1.7.会话切换配置完成后效果图 2.安全等级配置信息提取 2.1.安全访问配置(0x1001) 2.2.安全访问配置(0x1002) 2.3.安全访问配置(0x100

LOVE135149的博客 5838

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

作者 | cxuan来源 | 程序员cxuan责编| 王晓曼前言我最近一直在写Spring的文章,而且仅仅是 Spring FrameWork 的文章 ,从最开始的官网入门到现在源码的...

优快云资讯 2793

基于Java的OPC UA Server开发指南:从零开始构建高效服务器

本文介绍了如何使用开源项目org.eclipse.milo创建Java OPC UA Server。通过创建Spring Boot项目,添加Milo SDK依赖,定义Namespace类,服务器启动类以及监听器,详细阐述了建立OPC UA Server服务的步骤。启动后,服务器默认监听地址为opc.tcp://localhost:12685,可使用Softing OPC Client进行连接。

洛阳泰山的博客 3023

雷丰阳spring系列的笔记_怒肝8个月源码,我成为了 Spring 开源贡献者

我最近一直在写Spring的文章,而且仅仅是Spring FrameWork的文章 ,从最开始的官网入门到现在源码的深度分析。主要就是三个系列官网入门系列,Spring官网读书笔记,这一系列的文章是入门Spring的不二之选,也是后续源码阅读的基础杂谈系列,Spring杂谈,这主要是一些补充内容,可以帮助大家更全面学习到Spring中的各个知识点,同时也会分享一些源码阅读技巧,个人学习心得之类的,...

weixin_39605578的博客 715

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

❤️肝了一个SpringBoot+Vue的招聘系统【开源了】【还有教程】【强烈建议收藏】❤️

周末本来是配女友逛街的日子,但是最近沉迷技术无法自拔! 还把女友得罪了,我给女友转了一520的红包!我说你去逛街吧,我要写代码! 金九银十来了,小伙伴们,冲啊!前面已经整理了很多的面试题,拿去学习吧! 1,❤️爆肝!整理了一周的Spring面试大全【含答案】,吊打Java面试官【建议收藏】!❤️ 2,❤️肝完了,一天掌握数据结构和算法面试题,吊打面试官,建议收藏❤️ 3,❤️集合很简单?开什么玩笑?肝了一周,全是精华,万字讲解!面试再不怕集合问题了!!!❤️ 4,肝完了,总结了SpringBoo

程序员springmeng 3万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

腾讯P8大佬闭关3月携“Spring”笔记现世!怒肝出573页源码笔记

1. 什么是spring?Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。为什么要用Spring?因为Spring已经是Java EE事实上(de facto)的业界标准了,经过无数项目的实战检验。大家都基于同一个框架开发,就可以尽量减少没必要的交流。

m0_63437643的博客 79

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

spring源码系列(六)——番外篇如何编译spring的源码

学习spring源码的第一步便是需要去编译源码;很多网友在编译spring源码的时候遇到了困难继而放弃了spring源码的学习; 这篇文章主要来阐述如何正确的编译spring源码;首先你得检查你的网线能正常上网;最好网速还行;不然你会疯掉 下载spring源码 下载spring源码可以选择github或者码云(国内的);下载方式可以选择git clone 或者直接下载一个zip包;笔者推荐使用git clone这种方式;我在本地的d:\workspace下面clone了spring5.1.x的源码(写文.

java_lyvee的专栏 1万+

开源项目 globocom/opensource 指南

开源项目 globocom/opensource 指南 目录结构及介绍 本教程基于GitHub上的 globocom/opensource 项目(请注意,实际项目URL可能需要替换为有效的仓库地址,因为提供的URL并非真实的示例)。以下是一个典型的开放源代码项目目录结构概述,假设基于通用的最佳实践和一般理解,因为没有提供具体的项目细节。 globocom开放式源码/ ├── README.md ...

gitblog_00161的博客 1056

Spring源码编译及阅读源码入门

我为什么要去读源码 首先说明我并不是什么大佬,普普通通小开发一枚,那为什么我要去读源码呢? 其实不管是 Spring 还是 JDK 的源码,如果我们想要称为更高阶的开发者,阅读源码是必经阶段,第一可以提高自己的代码能力,因为个人觉得写好代码的最好方式就是看别人怎么写代码并学习,第二是提升自己后找到更好的工作,如果我们去看大厂的招聘要求基本都是要精通 S.

个人站点:javatv.net 2989

源码面前没有秘密,推荐 9 个带你阅读源码的开源项目

我最初是在 GitHub 找到了别人上传的旧版(0.11)注释源码,一通搜索下发现了原作者赵炯老师的网站。第一版发布于 2003 年,最新更新于 2021 年,维护了 18 年。这个阅读 Linux 源码的项目,虽然没有上传到 GitHub 但是内容、注释的源码、配套工具全部开源。C++

2401_87167707的博客 1311
上一篇: 我要穿越,干翻 “烂语言” JavaScript!
下一篇: 软件巨头卧谈会
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值