公众号后台回复“
面试
”,获取精品学习资料
扫描下方海报了解
专栏详情
本文来源投稿:
程序员cxuan
《Java工程师面试突击(第3季)》重磅升级,由原来的
70讲增至160讲
,内容扩充一倍多,升级部分内容请参见文末
我最近一直在写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 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,换而言之,怎么为伟大的开源来做贡献呢?正常来要达到这个目的有两个方式
直接在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 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); } }
<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,对比起来,我觉得至少应该还要添加一点
碰到的问题
担心闹乌龙
虽然在之前我已经调试过了无数次代码,但是心里还是没谱啊。毕竟我这么
谨(cai)慎(ji)
的一个人,万一被人喷了怎么办?不知道你会不会这么想,反正我当时就是这么想的,如果你是这么想的,建议你去看看别人提交的 issue。搜索条件如下
is:closed label:"status: invalid"
我觉得你看几个,自然就有信心了!
不知道要怎么提交
每个开源的项目,只要作者希望这个项目越来越好的话,都会详细的说明如何给这个项目做开源贡献,Spring肯定也不例外,这里还是以提交 issue 为例,当你点击 New issue 的时候会出现下面这张图
在上图左边的框里很明确的告诉了你提交issue应该要注意什么
首先,你应该要去 Stack Overflow 提问