4.3.1  ResourceLoader接口

ResourceLoader接口用于返回Resource对象;其实现可以看作是一个生产Resource的工厂类。

public interface ResourceLoader {
Resource getResource(String location);
ClassLoader getClassLoader();
}

getResource接口用于根据提供的location参数返回相应的Resource对象;而getClassLoader则返回加载这些Resource的ClassLoader。

Spring提供了一个适用于所有环境的DefaultResourceLoader实现,可以返回ClassPathResource、 UrlResource;还提供一个用于web环境的ServletContextResourceLoader,它继承了 DefaultResourceLoader的所有功能,又额外提供了获取ServletContextResource的支持。

ResourceLoader在进行加载资源时需要使用前缀来指定需要加载:“classpath:path”表示返回 ClasspathResource,“http://path”和“file:path”表示返回UrlResource资源,如果不加前缀则需要根据 当前上下文来决定,DefaultResourceLoader默认实现可以加载classpath资源,如代码所示

package lqy.springh4_3;

import java.io.File;
import java.io.IOException;
import java.io.InputStream; import org.junit.Assert;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.UrlResource; public class ResourceTest { public static void main(String[] args) throws IOException { } @Test
public void testResourceLoad1() {
ResourceLoader loader = new DefaultResourceLoader(); Resource resource = loader.getResource("classpath:lqy/springh4_3/test1.txt");
//验证返回的是ClassPathResource
Assert.assertEquals(ClassPathResource.class, resource.getClass());
}
@Test
public void testResourceLoad2() {
ResourceLoader loader = new DefaultResourceLoader(); Resource resource2 = loader.getResource("file:lqy/springh4_3/test1.txt");
//验证返回的是ClassPathResource
Assert.assertEquals(UrlResource.class, resource2.getClass()); }
@Test
public void testResourceLoad3() {
ResourceLoader loader = new DefaultResourceLoader(); Resource resource3 = loader.getResource("lqy/springh4_3/test1.txt");
//验证返默认可以加载ClasspathResource
Assert.assertTrue(resource3 instanceof ClassPathResource);
} }

aaarticlea/png;base64,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" alt="" />

对于目前所有ApplicationContext都实现了ResourceLoader,因此可以使用其来加载资源。

ClassPathXmlApplicationContext不指定前缀将返回默认的ClassPathResource资源,否则将根据前缀来加载资源;

FileSystemXmlApplicationContext不指定前缀将返回FileSystemResource,否则将根据前缀来加载资源;

WebApplicationContext不指定前缀将返回ServletContextResource,否则将根据前缀来加载资源;

其他:不指定前缀根据当前上下文返回Resource实现,否则将根据前缀来加载资源。

4.3.2  ResourceLoaderAware接口

ResourceLoaderAware是一个标记接口,用于通过ApplicationContext上下文注入ResourceLoader。

public interface ResourceLoaderAware {
void setResourceLoader(ResourceLoader resourceLoader);
}

1)  首先准备测试Bean,我们的测试Bean还简单只需实现ResourceLoaderAware接口,然后通过回调将ResourceLoader保存下来就可以了:

package lqy.springh4_3;

import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.ResourceLoader;
public class ResourceBean implements ResourceLoaderAware { private ResourceLoader resourceLoader; public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
public ResourceLoader getResourceLoader() {
return resourceLoader;
}
}

2)  配置Bean定义

 <bean class="lqy.springh4_3.ResourceBean"/> 

3)测试

package lqy.springh4_3;

import java.io.IOException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ResourceLoader; public class ResourceTest { public static void main(String[] args) throws IOException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:lqy/springh4_3/springh4_3.xml");
ResourceBean resourceBean = ctx.getBean(ResourceBean.class);
ResourceLoader loader = resourceBean.getResourceLoader();
System.out.print(loader instanceof ApplicationContext); }
}

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFEAAAA3CAIAAAD7QDEmAAAC4klEQVRoge2ZP5rsIAjAPZcH4jw0++o9BfUWr9/v1dxgqtyALYyAiUmM8/fNypci4xjlJ0QwhK+vv9/f/z7+fFwul2mapmn6/Pycsui9JGEUQGFxwkJs9zEIkGCUECSAdAhGQV62ANlPCJJ+EUgI+YK5JaKpWijAEucHwzlmIiEUlkwVJERBsnGRhGBWGlE6pJWZJMR59RXvLswiMzNTtrazM7MwCrIgCJd/STaLU76VmbHEi8JlI2Q7WyNLDA9gZgEUxkzFQiwYDbKd2Tx27cbR3izIfdCZVB8nyo2J365eZv8uYWZmr4r3+deS88z/vwzmwTyY30cGcwszYyVUVhs1MNKqJV2wG8w0/BZjbkuKzPvxkaAjPrNEF/3nRI9sMsv4Um5o2Y8xnw3bNtEuTISDwbNuV/g2QSXLXS72jZj3PaK+vjWFgeQqZlVFbyBIRIHgEuYac6vH0tzz0MjzjA3MV9lZjazMEIx8k9kJRhuhksluzLXuma3X5EQYu/Lthbqqh2bdjc7sD0YHQts9l+eHFr84z7wAXujkbaI6VZmhwWklj9nUs3WzOMlsMak861ViFdV6OrMcYFC73ZqZ59lHTjKYB/P7yGAezG/FnKJp57fe+wpVgv9N5DpmPU7SKiFjIbY6BnTUbtyYJ5LTc9L1zYAol4iozL1261VN3/T9Orq8CtKH+1AM65PC/WGh6HaeOZWLfLXBcsOyXgXXMRMU1RmdxepV4J469Iju2s3d65L+fS7LNIvFWmb+/pBTPZa+bl1yvUdsMLcetlRety7ZzOw/wj2P+SZ1yXbm0r33bD7qkq+XkzxCBvNgHszvI4O5iZkxhoP60WvLYD5iZoyhkJhrRgFQ/0sLQqAr41fJDfGshbuNnQkUX1mrzK5RCPSZx8rNmFdGqzEv/eQ3MD/NtIX0xKq15hvMqVcyrvr28/e/rvhsLur2sBWJ9oqIUNvDnmXzkZMM5sH8PjKYfwfzDxmekTGdvRPCAAAAAElFTkSuQmCC" alt="" />

注意此处“loader instanceof ApplicationContext”,说明了ApplicationContext就是个ResoureLoader。

由于上述实现回调接口注入ResourceLoader的方式属于侵入式,所以不推荐上述方法,可以采用更好的自动注入方式,如“byType”和“constructor”,此处就不演示了。

4.3.3  注入Resource

通过回调或注入方式注入“ResourceLoader”,然后再通过“ResourceLoader”再来加载需要的资源对于只需要加载某个固定的资源是不是很麻烦,有没有更好的方法类似于前边实例中注入“java.io.File”类似方式呢?

Spring提供了一个PropertyEditor “ResourceEditor”用于在注入的字符串和Resource之间进行转换。因此可以使用注入方式注入Resource。

ResourceEditor完全使用ApplicationContext根据注入的路径字符串获取相应的Resource,说白了还是自己做还是容器帮你做的问题。

接下让我们看下示例:

1)准备Bean:

package lqy.springh4_3;

import org.springframework.core.io.Resource;
public class ResourceBean3 {
private Resource resource;
public Resource getResource() {
return resource;
}
public void setResource(Resource resource) {
this.resource = resource;
}
}

2)准备配置文件

 <bean id="resourceBean1" class="lqy.springh4_3.ResourceBean3">
<property name="resource" value="lqy/springh4_3/test1.properties"/>
</bean>
<bean id="resourceBean2" class="lqy.springh4_3.ResourceBean3">
<property name="resource" value="classpath:lqy/springh4_3/test1.properties"/>
</bean>

注意此处“resourceBean1”注入的路径没有前缀表示根据使用的ApplicationContext实现进行选择Resource实现。

3)让我们来看下测试代码

package lqy.springh4_3;

import java.io.IOException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class ResourceTest { public static void main(String[] args) throws IOException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:lqy/springh4_3/springh4_3.xml"); ResourceBean3 resourceBean1 = ctx.getBean("resourceBean1", ResourceBean3.class);
ResourceBean3 resourceBean2 = ctx.getBean("resourceBean2", ResourceBean3.class);         System.out.println(resourceBean1.getResource() instanceof ClassPathResource);
        System.out.println(resourceBean2.getResource() instanceof ClassPathResource ); }
}

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAABOCAIAAABzB9X8AAADXElEQVR4nO2YwU7bMBjH/Vy58go8g9+A88Qb+LATB9QxdhiTxs23Sbts2uAwiQFS+0Fh0rgU1KSdOHD6dgh27CRFCfPH1Pb/U1RFrWvHv/zzJbEaTh+G04dD+nM4mh+OZh+Hs/c/J4Nv4yFdbmztTCaToiiKohgMBoXD7zNYgIJWCaBVBGgVAVpFWG+tZFgptuk7XgqtlpWqtoQW/kkrcbbwv6m0EmeamZktK10f3hJbzYaYmXXt1y4EfZJhlTH17yM9L6CVDNsyU9qFy0+eOFOsLZvMNQiwukNewlMVTEYrNsalOPTeLde62cyy0u441WMOan2WX/o2j5ubrOszkVat2MaDZaYSYezCtPbVanU0Bz9KeQDRCbAdcl1LnGWlWFs3kOtKtx6hdFrJsDbxBIgtVftPpLUTtiUXrbMNYxU2Lk9eLYMtamrVxu2XR67rg7VodQOl0GotW8MUpjVjY6vhw7Qaw71p1mtmbtNqdXCVdKGbVt95JLeptbo+EhWBUivZqp76tBIxGTbERjPFP/EzamtAy7Vpe97Z+2htfqnj7Ae3U2mtxNowGXfoxJbYZNVMEmuN68BTySXOVFQxaqW5Mhi3DEesxhK6ZZVaW0oYxeOFxWGVWYrXgeUDWkWAVhGgVQRoFQFaRUi2gmUyVX+7W2OgVYQEWslkKiIrXwWsVtr439y6kJcfnoigi9U4N4Jptdob9jpbtQZfstX+P8uMrNZG9Nq01tO+ElrPb+/Pb+8/nN0dnN0dnN4enE7e/fi9+2X0clpXJKAR6uRmdnJT7B//ent0vXd0/eb71e5X2vl81vcBqylngdayVRlRXwRWpKR61DQvpnlBl1duG9PFeHQx/nR0urm91+O5tbqWg1tWQ5ZvlRmj225Zq5FctbG107ptbu+9er2P14HnofI8z/O8KIry0zObzebzObQ+D2gVAVpFgFYRoFUEaBUhlVasYEVAqwgJtGJhsIlgWtd6YVBU6/ouDP5/rSsS0IhkD1hYGAxJ99yKhcEAvA6IAK0iQKsI0CoCtIoArSJAqwjQKgK0igCtIkCrCNAqArSKAK0iQKsI0CoCtIoArSJAqwjQKgK0igCtIkCrCNAqArSKAK0iQKsI0CoCtIoArSJAqwjQKgK0igCtIvwF7NX/e1saanQAAAAASUVORK5CYII=" alt="" />

接下来一节让我们深入ApplicationContext对各种Resource的支持,及如何使用更便利的资源加载方式。

开涛spring3(4.3) - 资源 之 4.3 访问Resource的更多相关文章

  1. 开涛spring3(4.2) - 资源 之 4.2 内置Resource实现

    4.2  内置Resource实现 4.2.1  ByteArrayResource ByteArrayResource代表byte[]数组资源,对于“getInputStream”操作将返回一个By ...

  2. 开涛spring3(4.1) - 资源 之 4.1 基础知识

    4.1.1  概述 在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源.File资源资源.ClassPath相关资源.服务器相关资源 (JBoss AS 5.x上的VFS资源)等 ...

  3. 开涛spring3(4.4) - 资源 之 4.4 Resource通配符路径

    4.4.1  使用路径通配符加载Resource 前面介绍的资源路径都是非常简单的一个路径匹配一个资源,Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源. Ant路径通配 ...

  4. 开涛spring3(1) - Spring概述

    1.1.1  Spring是什么 Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发.应用程序是由 ...

  5. 开涛spring3(12.2) - 零配置 之 12.2 注解实现Bean依赖注入

    12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的 ...

  6. 开涛spring3(9.2) - Spring的事务 之 9.2 数据库事务概述

    9.2.1  概述 Spring框架支持事务管理的核心是事务管理器抽象,对于不同的数据访问框架(如Hibernate)通过实现策略接口 PlatformTransactionManager,从而能支持 ...

  7. 开涛spring3(3.3) - DI 之 3.3 更多DI的知识

    3.3.1  延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy- ...

  8. 开涛spring3(3.1) - DI的配置使用

    3.1.1  依赖和依赖注入 传统应用程序设计中所说的依赖一般指“类之间的关系”,那先让我们复习一下类之间的关系: 泛化:表示类与类之间的继承关系.接口与接口之间的继承关系: 实现:表示类对接口的实现 ...

  9. 开涛spring3(12.3) - 零配置 之 12.3 注解实现Bean定义

    12.3  注解实现Bean定义 12.3.1  概述 前边介绍的Bean定义全是基于XML方式定义配置元数据,且在[12.2注解实现Bean依赖注入]一节中介绍了通过注解来减少配置数量,但并没有完全 ...

随机推荐

  1. Myeclipse8.5开发-插件安装二:安装findbugs方法

    环境:Myeclipse8.5 step 1:首先从官网下载findbugs插件:http://downloads.sourceforge.net/project/findbugs/findbugs% ...

  2. 【转】DHCP的请求过程

    首先你得清楚DHCP的请求过程:1.client向server发送请求,发向广播地址2.server向client回应一个IP,发向单播地址3.client向server回应一个确认,发向广播地址,表 ...

  3. iTunes制作iPhone手机铃声方法(mac版2017年4月更新)

    iTunes制作iPhone手机铃声方法(mac版2017年4月更新)   跟之前百度出来的不同,我自己使用后写的.     1.首先下载好你需要制作铃声的mp3文件,这里我放在桌面.       2 ...

  4. Android -- Annotation(注解)原理详解及常见框架应用

    1,我们在上一篇讲到了EventBus源码及3.0版本的简单使用,知道了我们3.0版本是使用注解方式标记事件响应方法的,这里我们就有一个疑问了,为什么在一个方法加上类似于"@Subscrib ...

  5. 使用NPOI生成Excel级联列表

    目录 1    概要    1 2    磨刀不误砍柴工——先学会Excel中的操作    2 3    利用NPOI生成导入模板    7 3.1    设置workbook&sheet   ...

  6. 一款好用的分页插件用于regularJS

    最近在用一款来自网易的javascript MVC 框架regularJS来写项目,这是网易一位叫郑海波的大神写的一款框架,所谓regualrJS, 作者这样取名主要是因为这个框架更像是angular ...

  7. KMP算法学习(详解)

    kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚.在此,综合网上比较好 ...

  8. 是什么让spring 5放弃了使用Guava Cache?

    一路走来,Spring社区从刚开始的核心模块一直发展到现在,最近Sping5也完成了M5的发布, 相信不久之后第一个RELEASE版本也会发布.里面有很多特性是和即将要发布的JAVA 9息息相关的.今 ...

  9. 少年,是时候换种更优雅的方式部署你的php代码了

    让我们来回忆下上次你是怎么发布你的代码的: 1. 先把线上的代码用ftp备份下来 2. 上传修改了的文件 3. 测试一下功能是否正常 4. 网站500了,赶紧用备份替换回去 5. 替换错了/替换漏了 ...

  10. 局域网内补丁更新80072EE2错误

    在公网中,80072ee2通常是在进行自动更新时遇到的连接性错误.通常由于三防杀毒软件或者浏览器,代理服务器设置不正确而导致的.那么如果是在局域网中遇到该问题,该如何解决呢? 错误截图: 1.首先确认 ...