知识点

相关文章

更多

最近更新

更多

【第四章】 资源 之 4.3 访问Resource ——跟我学spring3

2019-03-01 11:57|来源: 开涛

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资源,如代码所示(cn.javass.spring.chapter4.ResourceLoaderTest):

  1. @Test  

  2. public void testResourceLoad() {  

  3.    ResourceLoader loader = new DefaultResourceLoader();  

  4.    Resource resource = loader.getResource("classpath:cn/javass/spring/chapter4/test1.txt");  

  5.    //验证返回的是ClassPathResource  

  6.    Assert.assertEquals(ClassPathResource.class, resource.getClass());  

  7.    Resource resource2 = loader.getResource("file:cn/javass/spring/chapter4/test1.txt");  

  8.    //验证返回的是ClassPathResource  

  9.    Assert.assertEquals(UrlResource.class, resource2.getClass());  

  10.    Resource resource3 = loader.getResource("cn/javass/spring/chapter4/test1.txt");  

  11.    //验证返默认可以加载ClasspathResource  

  12.    Assert.assertTrue(resource3 instanceof ClassPathResource);  

  13. }  

      对于目前所有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 cn.javass.spring.chapter4.bean;  
import org.springframework.context.ResourceLoaderAware;  
import org.springframework.core.io.ResourceLoader;  
public class ResourceBean implements ResourceLoaderAware {  
    private ResourceLoader resourceLoader;  
    @Override 
    public void setResourceLoader(ResourceLoader resourceLoader) {  
        this.resourceLoader = resourceLoader;  
    }  
    public ResourceLoader getResourceLoader() {  
        return resourceLoader;  
    }  
}

2)  配置Bean定义(chapter4/resourceLoaderAware.xml):

<bean class="cn.javass.spring.chapter4.bean.ResourceBean"/>

3)测试(cn.javass.spring.chapter4.ResoureLoaderAwareTest):

  1. @Test  

  2. public void test() {  

  3.    ApplicationContext ctx = new ClassPathXmlApplicationContext("chapter4/resourceLoaderAware.xml");  

  4.    ResourceBean resourceBean = ctx.getBean(ResourceBean.class);  

  5.    ResourceLoader loader = resourceBean.getResourceLoader();  

  6.    Assert.assertTrue(loader instanceof ApplicationContext);  

  7. }  

      注意此处“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 cn.javass.spring.chapter4.bean;  
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)准备配置文件(chapter4/ resourceInject.xml):

  1. <bean id="resourceBean1" class="cn.javass.spring.chapter4.bean.ResourceBean3">  

  2.   <property name="resource" value="cn/javass/spring/chapter4/test1.properties"/>  

  3. </bean>  

  4. <bean id="resourceBean2" class="cn.javass.spring.chapter4.bean.ResourceBean3">  

  5. <property name="resource"  

  6. value="classpath:cn/javass/spring/chapter4/test1.properties"/>  

  7. </bean>  

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

    3)让我们来看下测试代码(cn.javass.spring.chapter4.ResourceInjectTest)吧:

  1. @Test  

  2. public void test() {  

  3.    ApplicationContext ctx = new ClassPathXmlApplicationContext("chapter4/resourceInject.xml");  

  4.    ResourceBean3 resourceBean1 = ctx.getBean("resourceBean1", ResourceBean3.class);  

  5.    ResourceBean3 resourceBean2 = ctx.getBean("resourceBean2", ResourceBean3.class);  

  6.    Assert.assertTrue(resourceBean1.getResource() instanceof ClassPathResource);  

  7.    Assert.assertTrue(resourceBean2.getResource() instanceof ClassPathResource);  

  8. }  

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


本文链接:领悟书生教程网,转自http://sishuok.com/forum/blogPost/list/0/2457.html

相关问答

更多
  • 给你个下载地址,很全的: http://www.verycd.com/topics/93279/ 滚动屏幕找到你要的内容,自己下载吧
  • //分太少啦,写一个简单的; //你自己看咯; import java.lang.*; class A{ void fun(){ //父类方法; } public static void main(){ A[] a = new A[2]; a[0] = new B; a[1] = new C; for(int i :a){ system.out.println(a[i]); } } class B extends A{ void fun(){ //子类B方法; } class C extends A{ vo ...
  • 《Java语言程序设计》是学习Java语言的入门教材。   全书从Java语言的基本特点入手,详细介绍了Java语言的基本概念和编程方法,同时深入介绍了Java的高级特性。   百度上有下载,你自己搜一下就行了。
  • 继承就是从一个类衍生出一个新的类,新的类就具有原来的类的属性、方法,也可以再另外定义属性、方法; 举例来说,比如,人,具有身高、体重等属性,也具有吃饭、睡觉的方法,那衍生出一个类-女人,“女人”继承了“人”,所以女人也有身高体重、吃饭、睡觉,同时女人也可以有自己特有的东西,比如生孩子、哺乳等等。。。
  • 您要的答案我已发送,请按照步骤进行操作!! 你的采纳是我前进的动力, 记得好评和采纳,互相帮助,
  • 网上搜一下,有直接有下载的。   《java程序设计》主要讲述了本书通过对Java编程语言的全面介绍,引导读者快速地掌握Java编程语言的核心内容并学会灵活运用所学的语言知识及面向对象的编程思想。   全书共分9章,内容包括Java语言概述、面向对象编程初步、Java的基本语法、类库与数组、面向对象编程深入、Applet程序、图形用户界面编程、异常处理和输入输出及多线程编程。
  • 一开始左边有有个蛋,按左他会停下来。1,连续的按左右,它会突然冲刺,在那一瞬间跳起来就行。(多试几次)。 2,再就是旋转的,你往左走他逆时针,往右顺时针,慢慢的进去,左右左右的出来,但要跳一下。有一块会掉。 4,之后是三个问号,不能随便跳,第一个问号。要把握好时间,让锯齿朝上并往又偏一点。因为左边还有一个问号是过关必备的,挡着了就拿不到了。也不要太下,因为你要跳过去。第二个问号是头 盔,吃了之后回去顶前面三个问号 5,先顶下面那个问号,掉下一个方块拿来垫脚,再移过去叠起来,再移过去顶最上面的,会有一个炸弹, ...
  • 如果更改 ,RichFaces将不会注入脚本。 但是,您必须手动插入其他所有内容,因此我建议首先使用加载页面并查看生成的HTML。 If you change for , RichFaces won't inject the scripts. You'll have to insert everything else manually, though, so I recommend first loading the page wi ...
  • 您的输入流可能无法正常关闭吗? 我曾经遇到同样的问题,发现它们仍然被打开了。 当我关闭它们时,“Too many files”异常消失了。 Is it possible that your input streams dont close properly? I once had the same problem and noticed that they were still opened. When I closed them, the "Too many files" Exception was go ...
  • OAuth 2.0由两个协议部分组成:如何从授权服务器“获取”访问令牌以及如何对资源服务器所服务的受保护资源“使用”访问令牌。 您从规范中粘贴的图片不包含“使用访问令牌”的内容,因为它在所有授权中都是通用的; 它只关注“获取访问令牌”的一小部分。 您的图表将两者放在一张图片中,但您将混合角色:REST API不是客户端。 客户是您的SPA。 API是资源服务器。 然后,您的图片代表(完整)标准OAuth 2.0资源所有者密码凭据流+附加令牌内省部分。 OAuth 2.0 consists of two pr ...