@javascript
關注個人朋友都知道,關注兩個字劃重點,要考!html
我最近一直在寫Spring的文章,並且僅僅是Spring FrameWork
的文章 ,從最開始的官網入門到如今源碼的深度分析。主要就是三個系列java
官網入門系列,Spring官網讀書筆記,這一系列的文章是入門Spring的不二之選,也是後續源碼閱讀的基礎git
雜談系列,Spring雜談,這主要是一些補充內容,能夠幫助你們更全面學習到Spring中的各個知識點,同時也會分享一些源碼閱讀技巧,我的學習心得之類的,雜談嘛,就是不知道放哪裏的文章都打算放這裏,好比這篇文章。程序員
源碼分析系列,Spring源碼解析,該專欄目前正在創做中,相對而言學習難度比較大,並且由於筆者寫的比較細,估計大部分同窗看起來會很費勁,不過若是你能認真看完,收穫絕對巨大!固然有不懂得地方也能夠給筆者留言,或者關注文章末尾的公衆號。github
本文的主要目的是教(zhuang)學(bi)spring
就是從筆者的實際經驗出發,談一談怎麼成爲一個開源項目的貢獻者。微信
我先說說我本身的經歷吧,在創做上篇文章的時候,筆者發現Spring在實例化對象的時候有這麼一段代碼,在org.springframework.beans.factory.support.ConstructorResolver#resolveConstructorArguments
方法中app
// 本文不探討技術細節,只是爲了簡單說明這個問題,因此省略無關代碼 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,換而言之,怎麼爲偉大的開源來作貢獻呢?正常來要達到這個目的有兩個方式
對應的就是在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,對比起來,我以爲至少應該還要添加一點
雖然在以前我已經調試過了無數次代碼,可是內心仍是沒譜啊。畢竟我這麼謹(cai)慎(ji)的一我的,萬一被人噴了怎麼辦?不知道你會不會這麼想,反正我當時就是這麼想的,若是你是這麼想的,建議你去看看別人提交的issue。搜索條件以下
is:closed label:"status: invalid"
我以爲你看幾個,天然就有信心了!
每一個開源的項目,只要做者但願這個項目愈來愈好的話,都會詳細的說明如何給這個項目作開源貢獻,Spring確定也不例外,這裏仍是以提交issue爲例,當你點擊New issue的時候會出現下面這張圖
在上圖左邊的框裏很明確的告訴了你提交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中已經接受個人建議。
因此我要說的就是,
真正動手的話,無論什麼問題總能找到解決方案
而只是停留在空想,在躊躇,你永遠有一堆問題
臨淵羨魚,不如退而結網
以此文與君共勉!
若是本文對你由幫助的話,記得點個贊吧!也歡迎關注個人公衆號,微信搜索:程序員DMZ,或者掃描下方二維碼,跟着我一塊兒認認真真學Java,踏踏實實作一個coder。
我叫DMZ,一個在學習路上匍匐前行的小菜鳥!
本文由博客羣發一文多發等運營工具平臺 OpenWrite 發佈