第10章-Spring的資源管理

Spring 提供了簡單的接口來管理資源,并支持多種資源類型。

一忆嗜、Resource 接口

Java 自帶的 java.net.URL 類只能處理 URL 前綴的資源,不能訪問更多類型的低級資源陕习。
因此霎褐,Spring 提供了 Resource 接口以及多種資源類型的實現(xiàn)。

public static void main(String[] args) throws Exception {

    // Resource
    Resource resource = new ClassPathResource("test/test-one.txt");
    System.out.println("Filename: " + resource.getFilename());
    System.out.println("Description: " + resource.getDescription());
    System.out.println("URI: " + resource.getURI());
    System.out.println("URL: " + resource.getURL());
    System.out.println("Data: " + streamToString(resource));
    System.out.println();
}

// Stream to String
private static String streamToString(Resource resource) throws IOException {
    return StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8);
}

1. 內(nèi)置實現(xiàn)

Spring 提供了下面幾種資源實現(xiàn):

UrlResource

UrlResource 包裝了 java.net.URL 類该镣,通過 URL 訪問資源,例如文件响谓、HTTP损合、FTP 資源。
通過協(xié)議前綴區(qū)分資源類型娘纷,例如 file: 訪問文件系統(tǒng)資源嫁审,還有 http:ftp: 等赖晶。

public static void main(String[] args) throws Exception {

    // UrlResource
    UrlResource fileResource = new UrlResource("file:E:/codeartist/spring/spring-ioc/src/main/resources/test/test-one.txt");
    UrlResource httpResource = new UrlResource("https://www.baidu.com/");
}

ClassPathResource

ClassPathResource 可以從 classpath 下獲取資源律适。

public static void main(String[] args) throws Exception {

    // ClassPathResource
    ClassPathResource classPathResource = new ClassPathResource("test/test-one.txt");
}

FileSystemResource

FileSystemResource 實現(xiàn)了對 java.io.File 資源的處理,支持 File 和文件路徑指定資源遏插。

public static void main(String[] args) throws Exception {

    // FileSystemResource
    FileSystemResource fileSystemResource =
        new FileSystemResource("E:/codeartist/spring/spring-ioc/src/main/resources/test/test-two.txt");
}

ServletContextResource

ServletContextResource 可以管理來自 ServletContext 的資源捂贿。

InputStreamResource

InputStreamResource 可以管理來自 InputStream 生成的資源。

ByteArrayResource

ByteArrayResource 可以管理來自 Byte 數(shù)組生成的資源胳嘲。

如果是從 Jar 包里面獲取資源厂僧,不能通過 File 形式獲取,只能通過流來獲取了牛。

2. 協(xié)議前綴

前綴 示例 描述
classpath: classpath:myapp/config.xml 加載來自 classpath 的資源
file: file:///data/config.xml 通過 URL 加載來自文件系統(tǒng)的資源
http: http://myserver/logo.png 通過 URL 加載來自網(wǎng)絡的資源
(none) /data/config.xml 依賴底層的 ApplicationContext

二颜屠、ResourceLoader 接口

ResourceLoader 接口用來加載 Resource辰妙,通過協(xié)議前綴來區(qū)分資源的類型。

所有的 Application Context 都實現(xiàn)了 ResourceLoader 接口甫窟,當使用 Application Context 來加載資源的時候密浑,如果沒有指定協(xié)議前綴,根據(jù) Application Context 的類型來指定從哪里加載粗井。

  • ClassPathXmlApplicationContext 加載 ClassPathResource
  • FileSystemXmlApplicationContext 加載 FileSystemResource
  • WebApplicationContext 加載 ServletContextResource

在 Bean 中可以使用 ResourceLoaderAware 注入當前上下文的 ResourceLoader尔破。

1. 資源注入

Spring 還支持通過 @Value 注解來注入資源,通過協(xié)議前綴來注入背传。

@Component
public class BeanExample {

    @Value("classpath:test/test-one.txt")
    private Resource resource;
    @Value("classpath:test/test-two.txt")
    private File file;
}

支持注入的字段類型有:File呆瞻、Resource 等。

2. Application Context 資源

通過 Application Context 加載單個資源径玖。

public static void main(String[] args) throws Exception {

    ApplicationContext applicationContext =
        new AnnotationConfigApplicationContext("cn.codeartist.spring.resource");

    Resource resource = applicationContext.getResource("classpath:test/test-one.txt");
}

Ant-style 風格

Application Context 通過 Ant-style 正則表達式加載多個資源痴脾。

public static void main(String[] args) throws Exception {

    ApplicationContext applicationContext =
        new AnnotationConfigApplicationContext("cn.codeartist.spring.resource");

    Resource[] resources = applicationContext.getResources("classpath:test/test-*.txt");
    for (Resource res : resources) {
        // do something
    }
}

classpath*: 前綴

Application Context 通過 classpath*: 前綴加載多個資源,該方式加載速度慢梳星,一般很少使用赞赖。
classpath: 表示只加載第一個 classpath 路徑下的資源。
classpath*: 表示加載系統(tǒng)中所有 classpath 路徑下的資源冤灾。

public static void main(String[] args) throws Exception {

    ApplicationContext applicationContext =
        new AnnotationConfigApplicationContext("cn.codeartist.spring.resource");

    Resource[] resources = applicationContext.getResources("classpath*:**/test-one.txt");
    for (Resource res : resources) {
        // do something
    }
}

ClassPathXmlApplicationContextWebApplicationContext 等 Bean 配置文件資源都是基于 ResourceLoader 接口來加載的前域。

三、附錄

1. 示例代碼

Gitee 倉庫:https://gitee.com/code_artist/spring
項目模塊:spring-ioc
示例路徑:cn.codeartist.spring.resource

最新文章關注 CodeArtist 碼匠公眾號韵吨。
更多:Spring高效實踐專欄

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匿垄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子归粉,更是在濱河造成了極大的恐慌椿疗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糠悼,死亡現(xiàn)場離奇詭異届榄,居然都是意外死亡,警方通過查閱死者的電腦和手機倔喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門铝条,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人席噩,你說我怎么就攤上這事班缰。” “怎么了班挖?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵鲁捏,是天一觀的道長。 經(jīng)常有香客問我,道長给梅,這世上最難降的妖魔是什么假丧? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮动羽,結(jié)果婚禮上包帚,老公的妹妹穿的比我還像新娘。我一直安慰自己运吓,他們只是感情好渴邦,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拘哨,像睡著了一般谋梭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倦青,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天瓮床,我揣著相機與錄音,去河邊找鬼产镐。 笑死隘庄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的癣亚。 我是一名探鬼主播丑掺,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼述雾!你這毒婦竟也來了街州?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤玻孟,失蹤者是張志新(化名)和其女友劉穎菇肃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體取募,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年蟆技,在試婚紗的時候發(fā)現(xiàn)自己被綠了玩敏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡质礼,死狀恐怖旺聚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眶蕉,我是刑警寧澤砰粹,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站造挽,受9級特大地震影響碱璃,放射性物質(zhì)發(fā)生泄漏弄痹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一嵌器、第九天 我趴在偏房一處隱蔽的房頂上張望肛真。 院中可真熱鬧,春花似錦爽航、人聲如沸蚓让。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽历极。三九已至,卻和暖如春衷佃,著一層夾襖步出監(jiān)牢的瞬間趟卸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工纲酗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衰腌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓觅赊,卻偏偏與公主長得像右蕊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吮螺,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容