探索SpringBoot-一塊兒看看Spring源碼之Resource(十)

前文回顧

上期講了Spring IoCrefresh函數,詳情請見探索SpringBoot-一塊兒看看Spring核心源碼之refresh(九),今天暫時緩一緩,畢竟後面的知識還得好好理一理。以前用力過猛,咱們還得打牢固一些基礎知識。好比在看refresh函數源代碼的過程當中,不知道你有沒有發現全部的Spring的資源都是經過Resource來訪問的。Spring會先將全部的資源轉化爲特定的Resource對象,以後纔會對其訪問。那麼這個Resource究竟是什麼呢?html

Resource

Resource的用途

通常,咱們啓動IoC容器的時候是下面這樣的。java

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/context.xml");
複製代碼

即便咱們不看源代碼,咱們也可以知道對於META-INF/context.xmlSpring內部必定會有一個根據這個地址獲取實際的XML文件的信息的代碼。bash

那麼Spring具體是怎麼作到的呢?函數

答案就是使用Resource。在Spring內部的全部資源,包括File,ClassPath,URL都會轉化爲Resource統一對外提供服務。post

好比上面這個最簡單在refresh函數的過程當中是這麼轉化的。url

Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);
複製代碼

沒錯,很明顯,雖然咱們不知道resourceLoader是幹嗎的。可是,這段代碼也很是容易理解,就是把location下面的XML文件轉化爲了Resource資源。spa

爲何要有Resource

由於在Java中傳統的訪問資源的方式是經過URL來抽象的。若是不記得URL抽象了,請翻一翻大學時候的Java基礎教材。通常是這樣來使用的。設計

URL url = new URL("http://www.runoob.com/index.html?language=cn#j2se");
     System.out.println("URL 爲:" + url.toString());
複製代碼

那麼若是要獲取相對於classpath下面的文件呢?傳統的Java是怎麼作的呢?首先第一步是要得到URL,以後才能獲取這個URL中存在的文件。以後才能用File對象來包裝生成。code

URL url = LearnResource.class.getClassLoader().getResource("meta-inf/context.xml");
        System.out.println(url.getFile());
        File file = new File(url.getFile());
        System.out.println(file.exists());
複製代碼

因此,直接使用URL得到classpath下面的資源仍是比較複雜的。cdn

另外,對於URL抽象來講,也沒有提供一些基本的方法。好比,檢查當前資源是否存在、檢查當前資源是否可讀等方法都是沒有。

所以,Spring使用到本身的Resource來對上述classpath下面的文件的訪問進行了一次封裝。

有了Resource以後,那麼能夠的怎麼訪問對應文件資源呢?一行搞定。是否是很簡單。

ClassPathResource classPathResource = new ClassPathResource("meta-inf/context.xml");
複製代碼

Resource的結構

Spring設計了Resource接口對外暴露資源的全部的訪問方式。Resource繼承了InputSteamSource來提供getInputStream方法來獲取InputStream。 另外還提供了getFile,exists,isReadable,getURL等。

對於不一樣的資源路徑,來提供了不一樣的對象來對象訪問好比ClassPathResourceFileSystemResource來分別訪問類路徑下,文件系統路徑下的資源。

最後附上一張Resource的繼承類圖。

想到一些以後繼續補充的點,一些ClassLoader的具體的實現內容,能夠考慮再想一想,以後講解下。這篇仍是先基本的介紹下Resource

關於寫做

之後這裏天天都會寫一篇文章,題材不限,內容不限,字數不限。儘可能把本身天天的思考都放入其中。

若是這篇文章給你帶來了一些幫助,能夠動動手指點個贊,順便關注一波就更好了。

若是上面都沒有,那麼寫下讀完以後最想說的話?有效的反饋和你的鼓勵是對我最大的幫助。

另外打算把博客給從新撿起來了。歡迎你們來訪問吃西瓜

我是shane。今天是2019年8月17日。百天寫做計劃的第二十四天,24/100。

相關文章
相關標籤/搜索