Spring源碼學習筆記-1-Resource

 

打算補下基礎,學習下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的能夠進去看

相關文章
相關標籤/搜索