日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Resource接口

發(fā)布時間:2023/12/2 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Resource接口 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【轉(zhuǎn)】https://blog.csdn.net/hbtj_1216/article/details/85487787

參考:官方文檔

1 簡介

Java標準庫中的java.net.URL類和標準處理器對于處理低層的資源沒有提供很好的功能。例如,并沒有提供一個URL的實現(xiàn)能夠從classpath或者ServletContext中讀取資源等等。因此,在Spring中提供了這樣一個Resource接口,能夠更加方便的讀取各種資源。

2 Resource接口

Spring提供的Resource接口,是對第低層資源訪問進行的一個抽象,提供能方便的使用。

下面是org.springframework.core.io.Resource接口的定義:

public interface Resource extends InputStreamSource { /** * 判斷資源在物理上是否存在 */ boolean exists(); /** * 表明該資源中的非空內(nèi)容是否可以通過getInputStream()讀取 */ default boolean isReadable() { return exists(); } /** * 表明該資源是否被一個打開的stream處理 */ default boolean isOpen() { return false; } /** * 判斷該資源是否代表文件系統(tǒng)中的一個文件 */ default boolean isFile() { return false; } /** * 返回該資源的URL */ URL getURL() throws IOException; /** * 返回該資源的URI */ URI getURI() throws IOException; /** * 返回該資源對應(yīng)的File */ File getFile() throws IOException; /** * 返回一個ReadableByteChannel(可讀的字節(jié)流通道) */ default ReadableByteChannel readableChannel() throws IOException { return Channels.newChannel(getInputStream()); } /** * 返回資源中內(nèi)容的長度 */ long contentLength() throws IOException; /** * 返回該資源的最后修改時間 */ long lastModified() throws IOException; /** * 創(chuàng)建一個和該資源相關(guān)的資源 */ Resource createRelative(String relativePath) throws IOException; /** * 返回文件名 */ @Nullable String getFilename(); /** * 返回資源的描述 */ String getDescription(); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

Resource接口繼承的InputStreamSource接口中海油一個非常重要的方法:

public interface InputStreamSource {/** * 找到并打開資源,返回讀取資源內(nèi)容的InputStream. 每次調(diào)用返回一個新的InputStream. */ InputStream getInputStream() throws IOException; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3 Spring中內(nèi)置的Resource接口的實現(xiàn)類

Spring中包含了如下幾個Resource接口的實現(xiàn)類:

  • UrlResource:從URL獲取資源。
  • ClassPathResource:從classpath獲取資源。
  • FileSystemResource:從文件系統(tǒng)獲取資源。
  • ServletContextResource:從servlet上下文獲取資源。
  • InputStreamResource:從InputStream獲取資源。
  • ByteArrayResource:從字節(jié)數(shù)組獲取資源。

UrlResource

UrlResource是對java.net.URL的封裝,可以被用來訪問任何可以通過URL訪問的資源對象,例如文件、HTTP目標對象、FTP目標對象等等。

每種類型的URL都有表示該類型資源的前綴。例如file:表示訪問文件系統(tǒng)的URL;http:表示通過http協(xié)議訪問;ftp:表示通過ftp協(xié)議訪問。

ClassPathResource

ClassPathResource表示從classpath中獲取資源。

FileSystemResource

FileSystemResource是對java.io.File和java.nio.file.Path的封裝,代表從文件系統(tǒng)中讀取文件。

ServletContextResource

ServletContextResource是為了方便你從ServletContext中獲取資源而設(shè)計的,可以從相對于web應(yīng)用程序的根目錄中獲取資源。

InputStreamResource

InputStreamResource是用來從給定的InputStream中獲取資源的。

ByteArrayResource

ByteArrayResource用來從給定的字節(jié)數(shù)組中獲取資源,它會創(chuàng)建一個ByteArrayInputStream。

4 ResourceLoader

ResourceLoader接口是用來加載資源的,它提供了一個getResource函數(shù)用來返回一個Resource對象。下面是它的定義:

public interface ResourceLoader {String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX; Resource getResource(String location); @Nullable ClassLoader getClassLoader(); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

所有的應(yīng)用程序上下文都實現(xiàn)了ResourceLoader接口,因此可以從應(yīng)用程序上下文中獲取Resource對象:

Resource template = ctx.getResource("some/resource/path/myTemplate.txt");
  • 1

如果在調(diào)用getResource()的時候,指定的資源路徑上沒有給出前綴,那么Spring會根據(jù)context的類型返回一個合適類型的資源對象。例如,在ClassPathXmlApplicationContext對象上調(diào)用getResource()函數(shù),則會返回一個ClassPathResource對象。

如果你指定了前綴,那么不管context是什么類型,都將返回前綴對應(yīng)的資源類型,例如:

Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");
  • 1

下表總結(jié)了資源路徑對應(yīng)的資源類型:

前綴例子說明
classpath:classpath:com/myapp/config.xml從classpath加載資源。
file:file:///data/config.xml從文件系統(tǒng)加載資源。
http:http://myserver/logo.png使用http協(xié)議加載資源。
(none)/data/config.xml根據(jù)context類型判斷。

5 ResourceLoaderAware接口

ResourceLoaderAware是Spring提供的一個回調(diào)接口,用于注入ResourceLoader:

public interface ResourceLoaderAware extends Aware { void setResourceLoader(ResourceLoader resourceLoader); }
  • 1
  • 2
  • 3
  • 4

如果一個類實現(xiàn)了ResourceLoaderAware接口并在Spring上下文中注冊為一個bean,那么context會調(diào)用它的setResourceLoader()方法將context本身設(shè)置進去(因為所有的context都實現(xiàn)了ResourceLoader接口)。

下面是一個例子:

@Component public class ResourceBean implements ResourceLoaderAware { private ResourceLoader resourceLoader; @Override public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } public ResourceLoader getResourceLoader() { return resourceLoader; } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
@Test public void test() { ApplicationContext ctx = new ClassPathXmlApplicationContext("test/resourceLoaderAware.xml"); ResourceBean resourceBean = ctx.getBean(ResourceBean.class); ResourceLoader loader = resourceBean.getResourceLoader(); Assert.assertTrue(loader instanceof ApplicationContext); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上述方法采用實現(xiàn)ResourceLoaderAware接口的方式注入ResourceLoader,屬于侵入式的方法。從Spring 2.5之后,可以直接通過@Autowired自動注入的方式注入ResourceLoader。

6 應(yīng)用個上下文和資源路徑

6.1 構(gòu)造一個應(yīng)用上下文

應(yīng)用上下文的構(gòu)造函數(shù)通常將資源的路徑以一個字符串或者字符串數(shù)組傳入。當路徑?jīng)]有前綴的時候,資源的類型依據(jù)上下文的類型構(gòu)建。

下面的例子,通過資源的路徑構(gòu)造一個ClassPathXmlApplicationContext上下文對象:

ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");
  • 1

下面的例子,根據(jù)資源路徑構(gòu)造一個FileSystemXmlApplicationContext上下文對象:

ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");
  • 1

也可以通過路徑前綴指定具體資源的類型。

6.2 資源路徑支持通配符

可以通過*來表示一批資源文件:

/WEB-INF/*-context.xml com/mycompany/**/applicationContext.xml file:C:/some/path/*-context.xml classpath:com/mycompany/**/applicationContext.xml
  • 1
  • 2
  • 3
  • 4

6.3 classpath*:和classpath:

classpath*:?和classpath:的主要區(qū)別體現(xiàn)在:

  • classpath::只會在當前項目的WEB-INF/classes路徑下查找文件。
  • classpath*::不只在當前羨慕的WEB-INF/classes路徑下查找文件,還會到第三方j(luò)ar文件的WEB-INF/classes查找文件。

6.4 FileSystemResource的路徑問題

為了兼容,FileSystemXmlApplicationContext中的相對路徑和絕對路徑都將視為相對路徑,相對于當前項目的工作目錄。

下面兩個是等價的:

ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/context.xml");
  • 1
ApplicationContext ctx = new FileSystemXmlApplicationContext("/conf/context.xml");
  • 1

如果真的需要絕對路徑,應(yīng)該盡量使用UrlResource并通過file:前綴來指定:

// actual context type doesn't matter, the Resource will always be UrlResource ctx.getResource("file:///some/resource/path/myTemplate.txt");
  • 1
  • 2
// force this FileSystemXmlApplicationContext to load its definition via a UrlResource ApplicationContext ctx = new FileSystemXmlApplicationContext("file:///conf/context.xml");

?

轉(zhuǎn)載于:https://www.cnblogs.com/exmyth/p/11306759.html

總結(jié)

以上是生活随笔為你收集整理的Resource接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。