1. 程式人生 > >5.2. Spring訪問資源

5.2. Spring訪問資源

Resource介面

spring為資源訪問提供了一個Resource介面,該介面提供了更強的資源訪問能力。

主要方法:

  • getInputStream():定位並開啟資源,返回資源對應的輸入流。每次呼叫都返回新的輸入流。呼叫者必須負責關閉輸入流。
  • exists():返回Resource所指向的資源是否存在。
  • isOpen():返回資原始檔是否開啟,如果資原始檔不能多次讀取,每次讀取結束時應該顯示關閉,防止資源洩漏。
  • getFile():返回資源對應的File物件。
  • getURL:返回資源對應的URL。

最後兩個方法通常無需使用,僅在通過簡單方式訪問無法實現時,Resource才提供傳統的資源訪問功能。

Resource介面本身不提供任何底層資源的實現邏輯,針對不同的底層資源,Spring提供不同的Resource實現類。這是典型的策略模式。

Resource實現類

  • UrlResource:訪問網路資源的實現類。
  • ClassPathResource:訪問類路徑資源。
  • FileSystemResource:訪問檔案系統資源。
  • ServletContextResource:訪問相對於ServletContext路徑下的資源的實現類。
  • InputStreamResource:訪問輸入流資源的實現類。
  • ByteArrayResource:訪問位元組陣列資源。

使用ServletContextResource
訪問應用相關資源

ServletContextResource類訪問WebContext下相對路徑下的資源。

構造方法:public ServletContextResource(ServletContext servletContext, String path)

使用ServletContextResource訪問資源無需關心資源是否被解壓縮出來,直接存放在jar中的資源也可以通過servlet容器訪問。

訪問位元組陣列資源

InputStreamResource用來訪問二進位制輸入流資源,只有當沒有合適的Resource實現時,才考慮使用InputStreamResource

,通常優先考慮使用ByteArrayResource,或者基於檔案的Resource實現。

InputStreamResource是一個總被開啟的Resource,所以isOpen()方法總是返回true。因此需要多次讀取某個流,就不要使用它。

個別情況下可以使用InputStreamResource例如從資料庫中讀取一個Blob物件,程式需要獲取該Blob物件內容,就可以先通過Blob的getBinaryStream()方法獲取二進位制輸入流,再將這個流包裝成Resource物件,然後就個可以通過Resource物件來訪問Blob物件所包含的資源了。

InputStreamResource的效率並不好。

使用字首方式訪問資源


UrlResource res = new UrlResource("file:///d:GenreUserId/1.txt");

UrlResource雖然是為了網路資源設計的,但通過使用file:字首也可以訪問本地磁碟資源。

常用的字首:
- file:
- http:
- ftp:
- classpath:

需要注意file: 字首的用法

ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext("/bean.xml");

上面兩行程式碼讀取了相同的配置資原始檔。
問題是:如果程式中明明採用的一個是絕對路徑、一個相對路徑,為什麼執行效果沒有任何區別?

產生問題的原因:當 FileSystemXmlApplicationContext 作為 ResourceLoader 使用時,它會發生變化,FileSystemApplicationContext 會簡單地讓所有繫結的 FileSystemResource 例項把絕對路徑都當成相對路徑處理,而不管是否以斜槓開頭,所以上面兩行程式碼的效果是完全一樣的。

如果程式中需要訪問絕對路徑,則不要直接使用 FileSystemResourceFileSystemXmlApplicationContext 來指定絕對路徑。建議強制使用 file: 字首來區分相對路徑和絕對路徑,例如如下兩行程式碼:

ApplicationContext ctx = new FileSystemXmlApplicationContext("file:bean.xml"); 
ApplicationContext ctx = new FileSystemXmlApplicationContext("file:/bean.xml");

上面第一條語句訪問相對路徑下的 bean.xml,第二條語句訪問絕對路徑下 bean.xml。相對路徑以當前工作路徑為路徑起點,而絕對路徑以檔案系統根路徑為路徑起點。

ResourceLoader介面、ResourceLoaderAware介面

  • ResourceLoader:實現類例項可以獲得一個Resource例項。
  • ResourceLoaderAware:介面例項獲得一個ResourceLoader例項。

ResourceLoader只有一個方法:

Resource getResource(String location)

ApplicationContext的實現類都實現了ResourceLoader介面。
因此ApplicationContext可以直接獲得Resource例項, 進而擁有載入資源的能力。

Resource res = ctx.getResource("1.txt");

通過ApplicationContext獲取資源的具體實現類由建立ApplicationContext時使用的實現類決定。也可以使用字首來強制指定使用那種實現類來讀取資源。

ApplicationContext中使用資源

ApplicationContext確定資源訪問策略有兩種方式:
* 使用ApplicationContext實現類指定訪問策略。
* 使用字首指定訪問策略。

字首訪問可以使用classpath*:來載入多個XML配置檔案。指定的檔案也可以使用萬用字元的形式配置,如 ClassPathXmlApplicationContext("beans*.xml")。萬用字元也可以和classpath*:一起使用。

ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:spring-*.xml");

注意: classpath*:字首僅僅對ApplicationContext有效classpath*:不可以用於Resource,使用classpath*:一次性訪問多個資源是行不通的。

使用Resource作為屬性


public class Student{
    private int age;
    private String name;
    Resource resource;
    //getter and setter ...
}

<bean id="student" class="com.erick.d1.hello.Student" >
    <property name="name" value="cat" />
    <property name="age" value="99" />
    <property name="resource" value="classpath:user.properties" />
</bean>

相關推薦

5.2. Spring訪問資源

Resource介面 spring為資源訪問提供了一個Resource介面,該介面提供了更強的資源訪問能力。 主要方法: getInputStream():定位並開啟資源,返回資源對應的輸入流。每次呼叫都返回新的輸入流。呼叫者必須負責關閉輸入流。

第五講:5.2 Spring方法注入

一,spring預設是單例模式 1,spring 預設管理的bean是單例,修改beans.xml , xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.or

Spring 進階(10)訪問資源2

這裡講的是ClassPathResource類,這個類的好處是它找的資源是類載入路徑下的資源。尤其,尤其是在web應用之中,它可以自動搜尋位於WEB-INF/classes下的資原始檔,這就堪稱神器了。 在一般的java程式中,類載入路徑是不包括到包名的,例如下面這個例子把資原始檔放在c

在Eclipse mars 4.5.2 中安裝spring 插件 spring tool suite

dea ins 菜單 eclips .com ips 比較 eclipse http 最近在學習spring,用到的IDE 有eclipse,也有用到 IDEA。 目前對spring還不是很了解,跟著網上的視頻來,先學會了spring,然後再選IDE。 題歸正轉,下面說說怎

Spring4 In Action-5.2.3-Spring Web應用程序-向頁面輸出列表、接收參數、接收表單

pla data prot template ack bin 通過 final span 源代碼鏈接:http://download.csdn.net/download/poiuy1991719/10117665 本代碼是基於數據庫表的操作,所以請先建立數據庫表 1

spring整合ehcache2.5.2緩存異常-- net.sf.ehcache.CacheException

already caused singleton auto ces eba fresh intercept while 報錯如下: The source of the existing CacheManager is: DefaultConfigurationSour

spring boot spring security 自定義 filter FilterSecurityInterceptor 訪問資源 靜態資源 和 不需要許可權訪問都失效了

問題:spring boot security 中, filters="none"  對應哪個? 自定義AbstractSecurityInterceptor後  靜態資源也進入攔截器,登陸頁面,permitall 也失效, 還是進

Spring 進階(9)訪問資源(1)

Spring提供了一個很膩害的資源訪問介面--Resource,注意,是提供了一個介面,而不是提供了一個類,實際上它提供了好多好多類,這種面向介面程式設計的思想是很酷的~~~~ 閒話少敘,說第一個Resource介面的實現類--UrlResource,這個類通過在構造方法中傳入需要獲取的

spring靜態資源訪問

在進行Spring MVC的配置時,通常我們會配置一個dispatcher servlet用於處理對應的URL。配置如下: <servlet> <servlet-name>springmvc</servlet-name>

Android開發筆記(2)--Android資源訪問機制

在開發中需要引用程式資源,比如專案中assets和res目錄下的圖片、layout、values等或者需要系統內建的資源。 資源分為兩種: 第一種:res目錄下的資源(不會被編譯,但是會生成id) 第二種:assets資料夾下的資原始檔,又叫原始資原始檔(不會被

Spring Data 官方文件》Reference Documentation至5.2. Examples Repository

對於大多數任務,您會發現自己在使用’CassandraTemplate’或Repository支援時,這兩者都利用了豐富的對映功能。CassandraTemplate是尋找訪問功能(例如遞增計數器或點對點CRUD操作)的所在。CassandraTemplate還提供了回撥方法,以便於您輕鬆獲取低階API工件

IntelliJ IDEA 學習SpringBoot(2) thymeleaf 資源訪問和路徑寫法

      上一篇檔案 我們介紹了 IntelliJ  IEDA工具建立 SpringBoot 以及 模板引擎 thymeleaf的簡單用法。今天這篇 介紹 如何使用 thymeleaf 訪問靜態資源 如css,js,圖片之類的。        這次我們打算寫一個登入頁面,

Android開發(2)--Android資源訪問機制

在開發中需要引用程式資源,比如專案中assets和res目錄下的圖片、layout、values等或者需要系統內建的資源。 資源分為兩種: 第一種:res目錄下的資源(不會被編譯,但是會生成id) 第二種:assets資料夾下的資原始檔,又叫原始資原始檔(不會被編譯,也不會生成id)

springcloud系列—Zuul—第5章-2: Spring Cloud Zuul 路由詳解

資料參考:《Spring Cloud 微服務實戰》 目錄 路由詳解 傳統路由配置 服務路由配置 服務路由的預設規則 自定義路由對映關係 路徑匹配 忽略表示式 路由字首 本地跳轉 cookie與頭資訊 重定向問題 路由詳解 傳統路由配置

Spring Security 3和CAS 3.5.2整合的完整例項

摘要 使用Spring Security 3與CAS 3.5.2整合,完成單點登入與單點登出。並使用Apache httpd做逆向代理。本實驗可以按照其中的步驟,一步一步的搭建一個稍微複雜的多網站整合系統。只要按照步驟走了,一定能跑起來。 回顧 在上一篇文章,利用S

Spring 4.2.5 + Hibernate 5.2.10 報錯筆記

專案離線無網開發,無法帖出報錯控制檯資訊 當@Transactional的isolation屬性指定了值時Hibernate執行總是抱錯無法執行 通過跟蹤程式碼發現Hibernate 5.2.10的C

WampServer 2.5設定手機訪問(403 Forbidden錯誤解決方法)

使用手機開啟http://***.***.***.***(本機ip)之後出現403錯誤 解決方法: 在右下角“WampServer 2.5”圖示上單擊左鍵 →  Apache → httpd.conf 將297行:Require local;替換為:Require all

5 . 2 . 2 p u b l i c:介面訪問

使用public 關鍵字時,它意味著緊隨在public 後面的成員宣告適用於所有人,特別是適用於使用庫的客戶 程式設計師。假定我們定義了一個名為dessert 的包,其中包含下述單元(若執行該程式時遇到困難,請參考第 3 章3.1.2 小節“賦值”): //: Cookie

python 3.5.2 下載(帶資源免費)

python 3.5.2 下載:連結:https://pan.baidu.com/s/1uTQlq9ajabGpuYVaE24vQg 密碼:oj8e 不知道怎麼回事,外網的eclipse和python這類資源網速都下不動了,最近想用3.5.2版本,一去網上下載,發現

eclipse4.5.2版本安裝springsource-tool-suite外掛成功之後找不到spring的處理辦法

最近學習spring,安裝springsource-tool-suite外掛,成功之後,在help-installation details裡面可以找到安裝的spring外掛,卻在window-preferences裡找不到spring,file-new裡面也沒有,甚至ma