`
flm_llx
  • 浏览: 63964 次
  • 性别: Icon_minigender_1
  • 来自: 应县
社区版块
存档分类
最新评论

Spring中的Resource接口

    博客分类:
  • java
阅读更多
Spring中的org.springframework.core.io.Resource接口代表着物理存在的任何资源,其继承于org.springframework.core.io.InputStreamSource;其子类有如下几种:ByteArrayResource, ClassPathResource, DescriptiveResource, FileSystemResource, InputStreamResource, PortletContextResource, ServletContextResource, UrlResource 。常用的有以下四种:
ClassPathResource:通过 ClassPathResource 以类路径的方式进行访问;
FileSystemResource:通过 FileSystemResource 以文件系统绝对路径的方式进行访问;
ServletContextResource:通过 ServletContextResource 以相对于Web应用根目录的方式进行访问。
UrlResource :通过java.net.URL来访问资源,当然它也支持File格式,如“file:”
先看一下Resource接口的定义:
public interface Resource extends InputStreamSource ...{
    boolean exists();

    boolean isOpen();

    URL getURL() throws IOException;

    File getFile() throws IOException;
                    
    Resource createRelative(String relativePath) throws IOException;   //根据相对路径创建资源

    String getFilename();

    String getDescription();
}
它提供我们访问资源最基本的接口。我们实际访问的时候直接用Resource接口就可以,不比使用其子类。在初始化时,其子类的实现各有不同。
首先看最常用的ClassPathResource :
    public InputStream getInputStream() throws IOException ...{
        InputStream is = null;
        if (this.clazz != null) ...{
            is = this.clazz.getResourceAsStream(this.path);
        }
        else ...{
            is = this.classLoader.getResourceAsStream(this.path);
        }
        if (is == null) ...{
            throw new FileNotFoundException(
                    getDescription() + " cannot be opened because it does not exist");
        }
        return is;
    }
这个是ClassPathResource 获得InputStream的代码,可以看出,它是通过Class或者ClassLoader的getResourceAsStream()方法来获得InputStream的。关于这两个类的方法的区别我另外的一篇文章已经解释。其path一般都是以“classpath:”开头,如果以“classpath*:”开头表示所有与给定名称匹配的classpath资源都应该被获取。
其次来看FileSystemResource:
    public FileSystemResource(String path) ...{
        Assert.notNull(path, "Path must not be null");
        this.file = new File(path);
        this.path = StringUtils.cleanPath(path);
    }   
    public InputStream getInputStream() throws IOException ...{
        return new FileInputStream(this.file);
    }
就是根据给定的Path来构造File,然后再构造FileInputStream。这儿的path一般要给出绝对路径,当然也可以是相对路径,但是如果使用相对路径要注意其根目录。例如在eclipse中,它的根目录就是你工程目录作为你的根目录。
再来看ServletContextResource:
    public InputStream getInputStream() throws IOException ...{
        InputStream is = this.servletContext.getResourceAsStream(this.path);
        if (is == null) ...{
            throw new FileNotFoundException("Could not open " + getDescription());
        }
        return is;
    }
ServletContextResource通过ServletContext的getResourceAsStream()来取得InputStream,这里path必须以“/”开头,并且相对于当前上下文的根目录。如常用path="/WEB-INF/web.xml"。
最后来看UrlResource:
    public UrlResource(String path) throws MalformedURLException ...{
        Assert.notNull(path, "Path must not be null");
        this.url = new URL(path);
        this.cleanedUrl = getCleanedUrl(this.url, path);
    }
    public InputStream getInputStream() throws IOException ...{
        URLConnection con = this.url.openConnection();
        con.setUseCaches(false);
        return con.getInputStream();
    }
UrlResource 封装了java.net.URL,它能够被用来访问任何通过URL可以获得的对象,例如:文件、HTTP对象、FTP对象等。所有的URL都有个标准的 String表示,这些标准前缀可以标识不同的URL类型,包括file:访问文件系统路径,http: 通过HTTP协议访问的资源,ftp: 通过FTP访问的资源等等。
在Spring配置文件中,我们只需要给出字符串类型的path即可,Spring会通过ResourceEditor(java.beans.PropertyEditor的子类)和ResourceLoader把给定的path转换为相应的Resource。转换规则如下:
前缀
例子
说明
classpath:
classpath:com/myapp/config.xml
从classpath中加载。
file:
file:/data/config.xml
作为 URL 从文件系统中加载。
http:
http://myserver/logo.png
作为 URL 加载。
(none)
/data/config.xml
根据 ApplicationContext 进行判断。
摘自于Spring Framework参考手册

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1818714
分享到:
评论

相关推荐

    (转)Spring中@Autowired注解和@Resource注解的区别

    在Spring框架中,`@Autowired`和`@Resource`注解是两个常见的依赖注入(DI, Dependency Injection)工具,它们都是用来解决组件之间的耦合问题,使得代码更加灵活和可测试。然而,这两个注解在具体使用时有一些关键性...

    spring-resource

    在本场景中,我们关注的是如何利用Spring的`Resource`接口来读取配置文件。这在Java应用程序,尤其是Spring应用中是常见的需求,因为配置文件通常用于设置应用的环境变量、数据库连接信息等。 `Resource`接口是...

    spring Resource管理详解

    Spring的Resource接口是访问资源的抽象,它提供了一种统一的资源访问方式,可以处理不同来源的资源,包括本地文件系统、类路径、URL等。Resource对象并不直接包含资源内容,而是提供了打开输入流、获取资源路径等...

    Spring_ClassPathResource获得bean对象

    Spring的ClassPathResource则提供了一个接口,用于处理这些类路径下的资源。 创建和使用ClassPathResource通常涉及以下步骤: 1. **创建实例**: 创建ClassPathResource实例时,你需要提供一个字符串参数,这个...

    详解Spring关于@Resource注入为null解决办法

    Spring 框架中,@Resource 注解是一种常用的依赖注入方式,用于将对象注入到应用程序中。但是,在实际开发中,经常会遇到 @Resource 注解的对象为 null 的问题。本文将详细介绍 Spring 中 @Resource 注解解决 null ...

    19 Spring MVC应用拓展Resource应用于文件下载慕课专栏1

    Spring MVC中的Resource接口不仅提供了`getInputStream()`方法,还封装了许多其他功能,使得操作各种类型的资源变得更加方便。Resource接口的实现类如UrlResource、FileUrlResource、FileSystemResource等,分别对应...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    Spring5中文文档

    资源管理章节涵盖了资源的获取和抽象,包括Resource接口的介绍、内置的Resource实现、资源加载器以及如何在应用上下文中使用资源路径。 验证、数据绑定和类型转换部分讲解了如何使用Spring的验证器接口进行验证,...

    CXF+spring+restful创建一个web的接口项目源代码

    3. **服务实现**:实现了服务接口中的方法,处理具体的业务逻辑。 4. **部署描述符**:如web.xml,用于配置CXF的Servlet,将CXF的前端控制器注册到Web应用中。 5. **依赖库**:项目中可能包含的jar包,如CXF、...

    Spring源码分析.pdf

    在 Spring 中,IOC 容器的实现基于 BeanFactory 接口,该接口定义了 IOC 容器的基本行为,包括获取 Bean 实例、判断 Bean 是否单例、获取 Bean 的别名等。 BeanFactory 接口的实现有多种,Spring 提供了多种 IOC ...

    Spring MVC RESTFUL接口实例和android测试客户端

    2. **定义服务接口**:在接口中声明对应RESTful接口的方法,指定HTTP方法、URL和请求参数。Retrofit会自动生成网络调用的实现。 ```java public interface ApiService { @GET("/users") Call<List<User>> ...

    spring4 中文API

    - **The Resource interface**:介绍了Resource接口及其用途。 - **Built-in Resource implementations**:列举了Spring内置的资源实现。 - **The Resource Loader**:解释了Resource Loader的作用。 - **The ...

    cxf集成Spring的restful WebService接口

    本教程将深入探讨如何在Spring环境中集成CXF以实现RESTful WebService接口。 首先,我们需要理解REST(Representational State Transfer)的概念。REST是一种软件架构风格,用于设计网络应用程序。它的核心思想是...

    Spring中文帮助文档

    4.2. Resource接口 4.3. 内置 Resource 实现 4.3.1. UrlResource 4.3.2. ClassPathResource 4.3.3. FileSystemResource 4.3.4. ServletContextResource 4.3.5. InputStreamResource 4.3.6. ByteArrayResource...

    spring-resource-parse:Spring原始解析,包含各种实例,ioc,aop,mvc,tx-源码包

    "spring-resource-parse"项目为我们提供了一个深入研究Spring框架的绝佳平台,通过阅读源码,我们可以看到这些核心组件在实际代码中的实现细节,这对于提升我们的技术水平和解决实际问题的能力大有裨益。此外,开源...

    spring framewok 4参考文档

    Resource接口是Spring对底层资源的抽象,它使得开发者可以采用统一的方式来操作不同类型的资源。Spring提供了多种内置的Resource实现,比如针对文件系统、URLs、classpath等资源类型。ResourceLoader接口负责加载...

    spring中的资源访问宝典

    本文将详细介绍Spring如何通过`Resource`接口及其实现类来简化资源的访问。 首先,传统的资源访问方式通常依赖于`java.net.URL`和文件I/O操作,这种方式不仅代码复杂,而且效率较低。例如,在`URLTest`类中,我们...

    spring2.5中文文档

    4. **数据访问集成**:Spring 2.5增强了对JDBC、Hibernate、JPA等数据访问技术的支持,引入了新的模板类和回调接口,使得数据访问更加简单。 5. **Bean表达式语言(EL)**:Spring Expression Language (SpEL)是...

    Spring中使用classpath加载配置文件浅析

    在Spring中,可以通过ApplicationContext接口的实现类,比如ClassPathXmlApplicationContext,来加载位于classpath中的配置文件。例如,创建一个ApplicationContext对象的代码如下: ```java ApplicationContext ...

    Spring中集合类型的装配

    此外,Spring还提供了如`@Resource`注解、`@Value`注解等更多方式来完成集合类型的装配,使得我们可以根据具体需求选择最合适的方法。 总的来说,Spring中集合类型的装配是一个强大的特性,它增强了Spring容器的...

Global site tag (gtag.js) - Google Analytics