日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發布時間:2025/3/21 javascript 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怒肝8个月源码,我成为了 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; }

我在提交?issue?時主要是按照這種思路

  • 首先擺出有問題的代碼

  • 描述具體的問題,我是直接通過一個例子來描述的

  • 說出自己的建議

  • 這幾天我又多看了看別人提交的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 中已經接受我的建議。

    所以我要說的就是,

    真正動手的話,不管什么問題總能找到解決方案

    而只是停留在空想,在躊躇,你永遠有一堆問題

    臨淵羨魚,不如退而結網

    以此文與君共勉!

    總結

    以上是生活随笔為你收集整理的怒肝8个月源码,我成为了 Spring 开源贡献者的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 99视频在线免费观看 | 久久香视频 | 蜜桃精品视频在线观看 | 蜜臀久久精品久久久久 | 97爱视频| 久久亚洲国产精品 | 91手机视频在线观看 | 男女在线观看视频 | 女人的天堂网站 | 色呦呦在线观看视频 | 日韩av.com | 国产在成人精品线拍偷自揄拍 | 男人插女人视频网站 | 精品久久久无码中文字幕边打电话 | 成人短视频在线 | 黄色中文字幕在线观看 | brazzers猛女系列 | 粗大黑人巨茎大战欧美成人免费看 | 亚洲黄色在线播放 | 国产人妻大战黑人20p | 婷婷看片 | 99在线精品视频免费观看20 | 日韩欧美一卡 | 亚洲美女网站 | 日韩一区免费 | 中文幕无线码中文字蜜桃 | 久久久香蕉 | 拔插拔插海外华人免费视频 | 91精品福利视频 | 啪在线视频 | 国产一区二区欧美 | 91琪琪| 王者后宫yin肉h文催眠 | 男女草比视频 | 韩日视频在线观看 | 亚洲综合精品 | 日本不卡视频在线播放 | 婷婷6月天| 免费在线一区二区三区 | 亚洲第九十九页 | 日本黄色大片免费看 | 国产精品嫩草影院桃色 | 日韩 欧美 亚洲 国产 | 免费看av毛片 | 日韩精品一区二区三区免费视频 | 欧美成人hd | 欧美一级大片 | 国产又好看的毛片 | 亚洲色精品三区二区一区 | 亚洲九九爱| 毛片国产精品 | 日本色悠悠| 国产原创在线播放 | 国产精品无码一区二区三区 | 欧美一级片网址 | 老熟女重囗味hdxx69 | 精品乱码一区二区三四区视频 | 国产一卡二卡 | 欧美成人xxx | 亚洲人成影视 | 91精品国产综合久久国产大片 | 国产中文字幕91 | 中文字幕第6页 | 欧美在线观看一区二区三区 | www.夜夜爽 | 久久6精品| 日本久久成人 | 国产玖玖在线 | 一区二区三区天堂 | 丰满人妻一区二区三区53号 | 成人精品在线观看 | 欧美日韩亚洲在线观看 | 欧美精品一卡二卡 | 自拍偷拍麻豆 | 天天干影院 | 91九色视频在线观看 | 国产在线喷水 | 最好看的2019年中文在线观看 | 日本电影一区二区三区 | 日韩男女啪啪 | 欧美在线视频网 | 樱花电影最新免费观看国语版 | 亚洲免费视频一区二区 | 亚洲欧美偷拍视频 | 痴女扩张宫交脱垂重口小说 | 熟女丰满老熟女熟妇 | 婷婷中文字幕 | 99爱99 | 雷电将军和丘丘人繁衍后代视频 | 麻豆影视在线播放 | 久久99激情 | 天天撸在线视频 | 7777奇米影视 | 波多野结衣av在线播放 | 国产精品自拍99 | 美女av免费在线观看 | 青青草网站 | 国产一级片网址 | 国产精品高清网站 |