Spring 资源访问

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进行资源访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值