<cite id="1ndtl"></cite>
<ruby id="1ndtl"></ruby>
<strike id="1ndtl"></strike>
<span id="1ndtl"><dl id="1ndtl"></dl></span><span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike>
<strike id="1ndtl"><dl id="1ndtl"><del id="1ndtl"></del></dl></strike>
<span id="1ndtl"></span>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike>
<strike id="1ndtl"></strike><span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike><strike id="1ndtl"></strike>
<strike id="1ndtl"></strike>
<span id="1ndtl"></span>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
<th id="1ndtl"><noframes id="1ndtl"><span id="1ndtl"><video id="1ndtl"><strike id="1ndtl"></strike></video></span> <strike id="1ndtl"></strike>
<strike id="1ndtl"></strike>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
  1. 首頁
  2. java開源 反爬蟲(怒肝 8 個月源碼,我成為了 Spring 開源貢獻者)

java開源 反爬蟲(怒肝 8 個月源碼,我成為了 Spring 開源貢獻者)

作者 | cxuan

來源 | 程序員cxuan

責編| 王曉曼

前言

我最近一直在寫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<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 時主要是按照這種思路:

首先擺出有問題的代碼;

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

說出自己的建議。

這幾天我又多看了看別人提交的issue,對比起來,我覺得至少應該還要添加一點:應該要明確的指出具體哪個版本上出現的問題。

碰到的問題

1、擔心鬧烏龍

雖然在之前我已經調試過了無數次代碼,但是心里還是沒譜啊。畢竟我這么謹(cai)慎(ji)的一個人,萬一被人噴了怎么辦?不知道你會不會這么想,反正我當時就是這么想的,如果你是這么想的,建議你去看看別人提交的 issue。搜索條件如下:

is:closed label:"status: invalid"

我覺得你看幾個,自然就有信心了!

2、不知道要怎么提交

每個開源的項目,只要作者希望這個項目越來越好的話,都會詳細的說明如何給這個項目做開源貢獻,Spring肯定也不例外,這里還是以提交 issue 為例,當你點擊 New issue 的時候會出現下面這張圖:

在上圖左邊的框里很明確的告訴了你提交issue應該要注意什么:

首先,你應該要去 Stack Overflow 提問;

如果是 bug,你應該要指明版本以及你想要做什么;

如果是一個增強的話,要提供上下文并且描述清楚問題;

同一個問題,issue 跟 PR 最好只提交一個,因為 GitHub 認為它們是一樣的,如果你還不能確定的話,先提交一個 issue。

而右上角還有更加詳細的文檔可供參考。

3、英文

大家應該看到了,整個 issue 都是用英文寫的,那么英文不好怎么辦呢?這個時候就要掏出我們的神器了:

嗯,就是詞典,筆者習慣是使用有道詞典。我建議英文不好的同學可以這樣,先將整個 issue 用中文寫好,如果你真的英文一竅不通的話,可以直接通過翻譯軟件逐句翻譯,然后粘貼到 GitHub 上。但是千萬千萬不要使用中文,就像下面這個哥們:

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

像這種 issue 是會被直接打上 invalid(不合格)標簽的,你就想想吧,你學不會英文,你指望我們的外國朋友能看懂中文嘛?是我中華上下五千年的文化不夠博大精深嗎?

4、擔心問題描述的不清楚

其實這個問題就是因為英文不好衍生出來的。因為英文不好,自然就會擔心我寫的東西他能不能看懂呢?我的建議就是,結合你測試的代碼去描述問題。你不用去擔心別人看不懂你寫的代碼,就以我那個 issue 的處理流程為例吧。

在你剛剛提交 issue 時,有專門的 issuemaster (issue管理員)會給你提交的 issue 打上一個 wait-for-triage 的標簽,標志這個 issue 是待處理的。

隨后我提交的這個 issue,就被指派給了 jhoeller 。你要擔心他看不懂代碼嗎?給你看兩個東西吧。

你知道那個紅框是啥意思嗎?就是說我發現的那個有問題代碼的類的作者就是他。

再看一張:

就是說,jhoeller 從 2003 年開始就已經是 Spring 這個項目的管理者以及發布經理了。2003 年,我還是一個小學生........

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

建議

其實筆者從發現這個問題到最終提交 issue 大概經過了一周時間,期間一直在猶豫要不要提交 issue,就是因為上面提到的幾個問題,一直躊躇不前。

但是等我下定決心要去做這件事的時候總共就花了幾個小時的時間。包括研究issue 提交的規則以及寫一篇英文版的 issue,并且我提交 issue 的第二天就馬上被處理了,并且 jhoeller 在 f9aae8d 這個 commit 中已經接受我的建議。

所以我要說的就是,

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

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

臨淵羨魚,不如退而結網。

以此文與君共勉!

?阿里云科學家入選計算機頂會 HPCA 名人堂,他是什么來頭?

?屏保壁紙引發血案,三星手機瞬間變磚

?可怕!CPU 竟成了黑客的幫兇

?Gary Marcus:因果熵理論的荒誕和認知科學帶給AI的11個啟示 | 文末贈書

?這 10 個云計算錯誤,會讓你的業務一蹶不振

?好撲科技結合區塊鏈行業發展趨勢,重磅推出“好撲區塊鏈合伙人”計劃

相關文章
美女网站色