打算補下基礎,學習下Spring源碼,參考書籍是《Spring源碼深度解析》,使用版本是Spring 3.2.x,原本想試圖用腦圖記錄的,發現代碼部分很差貼,仍是做罷,這裏只大略記錄下想法,不寫太細了html
類圖如上,java
文件結構圖如上。web
能夠看到 這些都在IO目錄下,幫助類集中存在support目錄下。最根級的接口是InputStreamSource,只有getInputStream()一個方法,在類中說明了,這是用來獲取InputStream的,指望每次調用都返回新的stream。沒有單純實現這個接口的類,不太清楚爲何只是單獨提出來作接口。ide
Resource做爲繼承的子類,多定義了不少方法工具
這些方法在AbstractResource都有了默認實現學習
public boolean exists() { // Try file existence: can we find the file in the file system? try { return getFile().exists(); } catch (IOException ex) { // Fall back to stream existence: can we open the stream? try { InputStream is = getInputStream(); is.close(); return true; } catch (Throwable isEx) { return false; } } }
先用得到文件判斷是否存在,得到文件的過程當中的IOException 再試圖獲取流,這個過程還可能拋錯,若是獲取文件過程當中雖然有拋錯,可是獲取流成功了,也算成功,算是一種雙保險,英文裏叫Fall back,這裏面的getFile在本類中有個 方法,直接拋錯,到子類裏去實現。隨便找兩個實現看看。ui
先看比較簡單的,getFile直接返回成員變量file,file由構造器初始化。url
ClassPathResource中沒找到getFile,原來在父類的AbstractFileResolvingResource中, 能夠看到他使用了ResourceUtils的工具類的獲取方法。AbstractFileResolvingResource方法裏用了不少getURL方法,可是都沒有具體實現,實現都在子類裏,感受 繞來繞去的idea
再看類介紹,這個類是用來把URI轉成File類的中間抽象類,這樣大概能夠看出,最上面那張圖真的是不一樣層級的抽象 FileSystemResource由於直接能拿到file,所很簡單,直接繼承就好了,classpath,sevletcontext,由於不是實際的File,加了層url的轉換,他們獲取url的方式不一樣,因此在子類裏實現,可是從url轉到file又是相通的,因此在父類實現。其餘功能則從工具類裏得到。spa
關於這個toURI方法,能夠看這個連接
https://blog.csdn.net/zunguitiancheng/article/details/79196598
這樣轉了一圈,上面圖裏不少類都看了,還有WritableResource ,這個類是FileSystemResource ,表示可寫,因此有輸出流。另外ContextResource的子類在web包裏。
ps idea的 alt+7的structure視圖,縱觀方法很好用
參考文章 :https://www.cnblogs.com/zrtqsk/p/4015985.html 這篇講的很細,很值得看 關於ClassPathResource的能夠進去看