接上篇:
webx筆記-Resource
在實際開發(fā)中,ResourceLoadingService是直接接觸最多的接口,其屏蔽了內部的Loader和Resource相關細節(jié)
1.ResourceLoadingService接口定義
相比之前這么多的ResourceLoader,一個接口全部搞定
測試代碼
@Test
public void serviceTest() throws IOException {
resourceLoadingService = (ResourceLoadingService) factory.getBean("testResource");
Resource res = resourceLoadingService.getResource("test.txt");
// 取得資源文件
File file = resourceLoadingService.getResourceAsFile("test.txt");
// 取得資源URL
URL url = resourceLoadingService.getResourceAsURL("test.txt");
// 取得資源輸入流
InputStream stream = resourceLoadingService.getResourceAsStream("test.txt");
}
ResourceLoadingService可以對標spring的DefaultResourceLoader
DefaultResourceLoader的測試代碼
@Test
public void testResourceLoader() throws IOException {
ResourceLoader loader = new DefaultResourceLoader();
Resource resource = loader.getResource("http://m2.xunbaozl.com/wxHome/selete.html");
System.out.println(resource instanceof UrlResource); //true
printContent(resource.getInputStream());
//注意這里前綴不能使用“classpath*:”触创,這樣不能真正訪問到對應的資源敞曹,exists()返回false
resource = loader.getResource("classpath:core/resources/test.txt");
System.out.println(resource instanceof ClassPathResource); //true
printContent(resource.getInputStream());
// resource = loader.getResource(System.getProperty("user.dir")+"/src/main/resources/core/resources/test.txt");
// System.out.println(resource instanceof ClassPathResource); //true
// printContent(resource.getInputStream());
}
當然ResourceLoadingService(下面稱RLS,簡寫方便)的實現遠遠沒這么簡單,從以上示例可以隱約感受到RLS肯定與ResourceLoader(webx)存在某種關聯關系,可以說RLS是其ResourceLoading的集大成者,包括了很多相關聯的功能,但對外只暴露一個接口服務,下面就慢慢剖析
2.RLS的定義
webx以解析schema的方式來定義RLS對象,如下定義
services:resource-loading
表示RLS對象
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:services="http://www.alibaba.com/schema/services"
xmlns:filters="http://www.alibaba.com/schema/services/resource-loading/filters"
xmlns:loaders="http://www.alibaba.com/schema/services/resource-loading/loaders"
xsi:schemaLocation="
http://www.alibaba.com/schema/services http://localhost:8080/schema/services.xsd
http://www.alibaba.com/schema/services/resource-loading/filters http://localhost:8080/schema/services-resource-loading-filters.xsd
http://www.alibaba.com/schema/services/resource-loading/loaders http://localhost:8080/schema/services-resource-loading-loaders.xsd
http://www.springframework.org/schema/beans http://localhost:8080/schema/www.springframework.org/schema/beans/spring-beans.xsd
">
<services:resource-loading id="testResource">
</services:resource-loading>
</beans:beans>
3.資源的定義
如果只定義services:resource-loading
標簽的話,還無法使用相關接口方法查找資源,必須還要定義相關資源
3.1 定義WebappResourceLoader
使用resource
定義資源,之后就可以加載其目錄下的資源了
<services:resource-loading>
<resource pattern="/" internal="false">
<loaders:webapp-loader />
</resource>
</services:resource-loading>
3.2 別名資源
使用resource-alias
定義一個別名資源
<services:resource-loading>
<resource pattern="/" internal="false">
<loaders:webapp-loader />
</resource>
<resource-alias pattern="/specFolder" name="/myfolder" />
</services:resource-loading>
當訪問specFolder目錄時,實際訪問的則是myfolder
如下示例
3.3 重定向資源
以下配置將/tf/cms重定向到myfolder目錄下
<services:resource-loading id="testResource">
<resource pattern="/tf/cms">
<loaders:file-loader basedir="../myfolder" />
</resource>
</services:resource-loading>
其他的可以參考webx文檔