Spring 资源访问

来源:互联网 发布:芒果tv2016旧版 mac 编辑:程序博客网 时间:2024/05/08 11:52

Spring为资源访问提供了一个Resource接口,该接口提供了比URL更强的资源访问能力。

Resource接口主要提供了一下几个方法。

  • getInputStream();定位并打开资源,返回资源对应的输入流。每次调用都返回新的输入流,调用者必须负责关闭输入流。
  • exists();返回Resource所指向的资源是否存在。
  • isOpen();返回资源文件是否打开,如果资源文件不能多次读取,每次读取结束时应该显示关闭,以防止资源泄露。
  • getDescription();返回资源的描述信息,用于资源处理出错时输出该信息,通常是全限定文件名或实际URL。
  • getFile:返回资源对应的File对象。
  • getURL:返回资源对应的URL对象。

Spring提供了大量的Resource实现类:

  • URLResource:访问网络资源的实现类。
  • ClassPathResource:访问类加载路径里资源的实现类。
  • FileSystemResource:访问文件系统里资源的实现类。
  • ServletContextResource:访问相对于ServlerContext路径里的资源的实现类。
  • InputStreamResource:访问输入流资源的实现类。
  • ByteArrayResource:访问字节数组资源的实现类。

Spring提供了如下两个标志性接口:

  • ReourceLoader:该接口实现类的实例可以获得一个Resource实例。
  • ResourceLoaderAware:该接口实现类的实例将获得一个ResourceLoader的引用。

在ResourceLoader接口里有如下方法:

  • Resource getResource(String
    location):该接口仅包含这个方法,该方法用于返回一个Resource实例。ApplicationContext的实现类都实现ResourceLoader接口,因此ApplicationContext可用于直接获取Resource实例。
        //ClassPathXmlApplicationContext是从类资源文件下(src)下寻找文件//      ApplicationContext ctx = new //          ClassPathXmlApplicationContext("bean.xml");        //创建ApplicationContext实例        //使用FileSystemXmlApplicationContext会从项目下找文件        ApplicationContext ctx = new             FileSystemXmlApplicationContext("bean.xml");        Resource res = ctx.getResource("book.xml");        //获取该资源的简单信息        System.out.println(res.getFilename());        System.out.println(res.getDescription());        //创建Dom4j的解析器        SAXReader reader = new SAXReader();        Document doc = reader.read(res.getFile());        //获取根元素        Element el = doc.getRootElement();        List l = el.elements();        //遍历根元素的全部子元素        for (Iterator it = l.iterator();it.hasNext() ; ){            //每个节点都是<书>节点            Element book = (Element)it.next();            List ll = book.elements();            //遍历<书>节点的全部子节点            for (Iterator it2 = ll.iterator();it2.hasNext() ; )            {                Element eee = (Element)it2.next();                System.out.println(eee.getText());            }        }
        //通过标准classpath:前缀,强制使用classPathResource        Resource res = ctx.getResource("classpath:book.xml");        //通过标准file:前缀,强制使用UrlResource访问本地资源        Resource res = ctx.getResource("file:book.xml");        //通过标准http:前缀,强制使用UrlResource访问基于http协议的网络资源        Resource res = ctx.getResource("http://localhost:8080/bean.xml");

以下是常见的前缀及对应的访问策略:

  • classpath:以classpathresource实例来访问类加载路径下的资源。
  • file:以urlresource实例访问本地文件 系统的资源。
  • http:以URLResource实例访问基于HTTP协议的网络资源。
  • 无前缀:由ApplicationContext的实现类决定访问策略。

使用Resource作为属性:
如果Bean实例访问资源,有以下两种策略:

  • 代码中获取Resource实例。
  • 使用依赖注入。
<?xml version="1.0" encoding="GBK"?><!-- Spring配置文件的根元素,使用spring-beans-3.0.xsd语义约束 --><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://www.springframework.org/schema/beans"    xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">    <bean id="test" class="com.bh.service.TestBean">        <!-- 注入资源 -->        <property name="resource"            value="classpath:book.xml"/>    </bean></beans>

在ApplicationContext中使用资源:
ApplicationContext确定资源访问策略通常有两个方法:

  • ApplicationContext实现类指定访问策略。
  • 前缀指定访问策略。

ApplicationContext实现类指定访问策略:
当我们创建ApplicationContext对象时,通常可以使用如下三个实现类。

  • ClassPathXMLApplicationContext:对应使用ClassPathResource进行资源访问。
  • FileSystenXmlApplicationContext:对应使用FileSystemResource进行资源访问。
  • XmlWebApplicationContext:对应使用ServletContextResource进行资源访问。
0 0
原创粉丝点击