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
例項把絕對路徑都當成相對路徑處理,而不管是否以斜槓開頭,所以上面兩行程式碼的效果是完全一樣的。
如果程式中需要訪問絕對路徑,則不要直接使用 FileSystemResource
或 FileSystemXmlApplicationContext
來指定絕對路徑。建議強制使用 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