菜鳥的spring 3 0原始碼學習之旅(1)

2021-06-18 19:33:10 字數 3271 閱讀 5606

首先呢,我先介紹一下我自己吧,我呢叫小辭,20歲的小夥子

,為了提公升自己,為了和大家共同交流技術,所以,我把我每天學習spring 3.0原始碼的心得和經驗還有自己的一點小小的體會與大家分享,希望大家多多捧場啦

還有呢,因為本人並不算是乙個嚴格意義上的大學生(電氣自動化的成考大專,你們懂的),所以呢,還有本人經驗以及知識上的不足,我所說的東西不一定就是對的,希望大家懷著懷疑的心態去閱讀我的體會。可能話相當的羅嗦,但是沒辦法,這就是我的思維,考慮的盡量全面一點,羅嗦就羅嗦吧,再說了,我也是乙個菜鳥,菜鳥當然會對一些基礎的,高手們不屑一顧的東西關心不已嘛。。。理解萬歲吧

那麼,開始正題吧

我想,大家對於org.springframework.core.io.resource介面不是很陌生,今天呢,我們就講解這個類以及它的子類org.springframework.core.io.filesystemresource(如不特殊說明,今天所有的類都位於org.springframework.core.io包下面)

首先呢,我們先看一下他們的機構,resource是乙個介面,由abstractresource抽象類實現部分公用的方法,然後呢,由各個子類去分別實現abstractresource抽象類

對於resource,我覺得沒有什麼好講的,介面嘛。。。大家懂的,但是呢對於abstractresource,我卻產生了比較濃厚的興趣,首先呢,在於它對於介面定義的那些方法的實現上面,比如說,大家看一下其中的幾個語句

org.springframework.core.io.abstractresource#isreadable()

public boolean isreadable()

org.springframework.core.io.abstractresource#isreadable()

public file getfile() throws ioexception

我想大家對於這兩個語句不是很陌生,但是奇怪的就在於,為什麼在這個方法裡,它總是返回true,而對於第二個方法來說,它則是直接的丟擲乙個異常?

我想聰明的大家應該會很快的明白,這些其實是為了讓子類去覆蓋它們,也就是說,假如它們的實現類沒有覆蓋abstractresource相應的方法的話,它們很可能會丟擲異常,或者是這個方法很可能會失效

那麼為什麼要這麼寫呢?

我想地球人都知道,抽象類本身就是對於那些實現類高度抽象以後的結果,也就是說,這些方法都是以後它們的子類實現類必須需要實現的方法,因為每乙個實現類對於每乙個相同的方法的實現都不太相同,所以在抽象類中,考慮的主要就是假如實現類沒有實現我的這個方法,我就必須要告知它們,或者丟擲異常,或者失效

那麼大家又可能會問,如果要是按照上面說的話的意思的話,那麼這個abstractresource豈不是可有可無呢,我想應該不是的,因為在這裡並不是所有的方法都必須被覆蓋,可能有基礎不是很好的童鞋們可能會擔心假如實現了這個抽象類是不是完全不能使用呢,那麼,我可以很嚴肅的告訴你,抽象類以及介面是不能被例項化的,所以你們就大大的放心好了,不過可以用靜態方法哦!

在很久很久以前,每當我看到大嬸們寫的那些非常牛的框架裡,都喜歡加乙個tostring方法,以前覺得特神秘,有種大嬸一樣的氣勢!不過問了度娘才知道,這個方法是用來進行除錯的,至於怎麼除錯呢,給個懸念啦

對於在resource以及子類裡,我個人實在理解不了getdescription()方法和tostring()方法有什麼不同

org.springframework.core.io.abstractresource#tostring()

public string tostring()

好嘛。。。。既然是用getdescription()方法實現的,那麼完全就沒必要寫兩個方法嘛,

org.springframework.core.io.filesystemresource#getdescription

public string getdescription()

對於這個呢?我更加理解不了了,在我看來,完全就沒必要這麼寫嘛。。。直接用file.tostring()就好了嘛。難道是這樣寫覺得很酷?很正規?在這裡還是求大神們解釋下拉

在filesystemresource類裡,有兩個字段

private final file file;

private final string path;

有了這兩個字段,讓我更加相信了resource的底層用的其實還是file類以及它的方法,這個file檔案還是private final的,並且沒有相應的getter,setter方法,有這個我們可以知道,它的核心是隱藏的,不許修改的,但是這個又比file檔案更加的規範,功能也更加全面,也更加的強壯,例如下面這個**

org.springframework.core.io.filesystemresource#isreadable()

public boolean isreadable()

當我看到這個方法的時候,我才恍然大悟,原來在file檔案裡,對於目錄是可讀可寫可執行的,當時我和小夥伴們都驚呆了,如果要是對於乙個普通的txt檔案來說,那麼它是可讀可寫的,那麼它的路徑也是可讀可寫的,那麼我們就有必要規範一下,在不是目錄的情況下的檔案時可讀的,那才返回true,

以前我一直問自己,雜湊碼有什麼用,我想在這裡,它的用處其實就是乙個身份證號碼,用來確定引用的是不是同乙個底層檔案

org.springframework.core.io.filesystemresource#hashcode()

public int hashcode()

恩恩。。。我再讓大家看乙個構造器

public filesystemresource(file file)

很顯然,這個是filesystemresource的構造器,但是呢大家注意到沒有,它的第一句是進行不為空的檢查,如果檔案為空,則丟擲異常,其實吧,這個也好理解,這個檔案的核心就是file檔案,如果核心都為null了,那麼別的就沒必要說了

另外呢,我再講解乙個有關工具類的吧

public static string trimleadingcharacter(string str, char leadingcharacter)

stringbuilder sb = new stringbuilder(str);

while (sb.length() > 0 && sb.charat(0) == leadingcharacter)

return sb.tostring(); }

在這裡呢,我覺得這個stringbuilder寫的很好,用它來進行字串中字元的增減,節能又環保啊,所以我比較推薦在對於字串中字元的增刪的修改中,用stringbuilder或許是乙個比較不錯的選擇

好了,哥們困了,該睡覺覺去了,單身好寂寞呀。。。。。。。。晚安 小辭

菜鳥的spring 3 0原始碼學習之旅(4)

終於接觸到spring的核心了,心情有點激動,但是呢,又很糾結,糾結的在於原始碼的複雜性可能要超出我的預料,而我知識的短板也將更集中的展現出來 不過呢,有一句話叫良藥苦口利於病,還有一句話叫難者不會會者不難,這兩個對於我來說,都是合適的,因為它對我實實在在有利,所以才有必要去看,因為難所以要下更大的...

菜鳥的spring 3 0原始碼學習之旅(1)

首先呢,我先介紹一下我自己吧,我呢叫小辭,20歲的小夥子,為了提公升自己,為了和大家共同交流技術,所以,我把我每天學習spring 3.0原始碼的心得和經驗還有自己的一點小小的體會與大家分享,希望大家多多捧場啦 還有呢,因為本人並不算是乙個嚴格意義上的大學生 電氣自動化的成考大專,你們懂的 所以呢,...

菜鳥的spring 3 0原始碼學習之旅(4)

終於接觸到spring的核心了,心情有點激動,但是呢,又很糾結,糾結的在於原始碼的複雜性可能要超出我的預料,而我知識的短板也將更集中的展現出來 不過呢,有一句話叫良藥苦口利於病,還有一句話叫難者不會會者不難,這兩個對於我來說,都是合適的,因為它對我實實在在有利,所以才有必要去看,因為難所以要下更大的...