天天看點

Spring5參考指南: Resources

内置Resource實作

ResourceLoader

ResourceLoaderAware

資源作為依賴

構造ClassPathXmlApplicationContext-快捷方式

資源路徑通配符

FileSystemResource注意事項

Spring定義了Resource接口用來對資源的通路,一般來說資源有兩種形式,一種是URL的形式從外部連結加載,一種是File的形式從系統本身查找。

Spring的Resource提供了如下接口:

Resource繼承了InputStreamSource接口,下面是其定義:

Spring有如下幾種内置資源實作:

UrlResource

ClassPathResource

FileSystemResource

ServletContextResource

InputStreamResource

ByteArrayResource

UrlResource封裝了java.net.URL,可用于通路通常可通過url通路的任何對象,如檔案、HTTP目标、FTP目标和其他對象。所有URL可以使用一個标準化字首來表示一個URL類型。例如:

file:用于通路檔案系統路徑。

http:用于通過HTTP協定通路資源。

ftp:用于通過FTP通路資源。

表示從類路徑加載資源。如果資源路徑帶上字首ClassPath:,那麼會隐式的解析為ClassPathResource。

注意,如果類資源檔案是在檔案系統中,則該資源實作會被解析為java.io.File, 如果是在Jar包中,則會使用java.net.URL來解析。

他是java.io.File和java.nio.file.Path的Resource實作,支援解析為File或者URL。

這是ServletContext的Resource實作,用于解釋相關Web應用程式根目錄中的相對路徑。

InputStreamResource 是InputStream 的Resource實作。隻有在其他Resource實作不可用的時候才考慮使用它。

和其他的Resource實作相反,它是一個already-opened resource的描述器,是以isOpen()會傳回true。 如果你想儲存資源描述器或者多次讀取一個stream, 那麼不要使用它。

是byte array的Resource實作, 它建立了ByteArrayInputStream。

它對于從任何給定的位元組數組加載内容都很有用,而不必求助于單次使用的InputStreamResource。

ResourceLoader用來傳回Resource執行個體,下面是其定義:

所有的 application contexts 都實作了ResourceLoader類。是以所有的application contexts 都可以用來擷取Resource。

當在特定的應用程式上下文上調用getResource(),并且指定的位置路徑沒有特定的字首時,将傳回适合該特定應用程式上下文的資源類型。例如,假設對ClassPathXmlApplicationContext執行個體執行了以下代碼片段:

在ClassPathXmlApplicationContext中,這個方法傳回ClassPathResource,如果在FileSystemXmlApplicationContext中,方法傳回FileSystemResource。 在WebApplicationContext, 方法傳回ServletContextResource。 他會傳回和ApplicationContext相對應的Resource實作。

當然,你可以強制ClassPathResource使用,而不管ApplicationContext到底是什麼。這樣做你需要添加classpath:字首。如下:

同樣的,你可以強制使用UrlResource通過添加标準的java.net.URL字首。

ResourceLoaderAware接口是一個特殊的回調,表明該元件需要提供一個ResourceLoader的引用。 下面是ResourceLoaderAware的定義:

當一個類實作了ResourceLoaderAware并被部署到application context,那麼整個類就被識别為ResourceLoaderAware。 application context會去調用setResourceLoader(ResourceLoader)方法,并将其自身作為參數傳入(所有的Spring application contexts 都實作了ResourceLoader 接口)。

在應用程式元件中,你也可以使用自動裝載ResourceLoader,來替代使用ResourceLoaderAware接口。可以使用傳統的constructor或者byType的自動裝載模式。或者使用注解的方式。

如果想将靜态資源注入到Bean中,可以簡單的将String路徑轉換為Resource對象。 如果Bean定義了一個Resource類型的template屬性,那麼下面就是一個很簡單的資源配置的例子:

ClassPathXmlApplicationContext提供了一個快捷方式來查找需要加載的資源路徑。

隻需提供一個字元串數組,該數組隻包含XML檔案本身的檔案名(不包含前導路徑資訊),還提供一個類。然後,ClassPathXmlApplicationContext從提供的類中派生路徑資訊。

如下:

下面是檔案結構:

Ant-style Patterns

定義資源路徑可以是用Ant-style的通配符,下面是 Ant-style patterns 的路徑例子:

classpath:字首*

構造基于XML的application context,路徑位址可以使用classpath*: 字首,如下:

classpath* 和 classpath 有什麼差別呢?

classpath* 會去查找所有比對的classpath, 而classpath 隻會找到第一個比對的資源。

未連接配接到FileSystemApplicationContext的FileSystemResource(即,當FileSystemApplicationContext不是實際的ResourceLoader時)會按預期處理絕對和相對路徑。相對路徑相對于目前工作目錄,而絕對路徑相對于檔案系統的根目錄。

但是,由于向後相容性(曆史)的原因,當FileSystemApplicationContext是ResourceLoader時,這一點會發生變化。FileSystemApplicationContext強制所有附加的FileSystemResource執行個體将所有位置路徑視為相對路徑,不管它們是否以前導斜杠開頭。實際上,這意味着以下示例是等效的:

在實踐中,如果需要真正的絕對檔案系統路徑,則應避免将絕對路徑與FileSystemResource或FileSystemXmlApplicationContext一起使用,并通過使用file: URL 字首強制使用UrlResource。以下示例說明了如何執行此操作:

本節的例子可參考resources

更多精彩内容且看:

區塊鍊從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特币等持續更新

Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新

Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新

java程式員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

繼續閱讀