资源访问 - Resource

来源:互联网 发布:淘宝seo pdf 编辑:程序博客网 时间:2024/05/01 06:07

对于JAVA来说,资源访问通常有java,net.URL和文件IO流来完成,如果需要访问来自网络的资源时,通常选择URL类,可是URL类目前还无法在类加载路径或者相对于ServletContext的路径中访问资源。虽然可以使用特定的URL前缀注册新的处理类,但是这样做通常比较复杂,而且URL接口还缺少一些有用的功能,比如检查所指向的资源是否存在等。

Spring提供了一个Resource接口,该接口是所有资源访问类所实现的接口,该接口主要提供了如下几个方法:

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

Resource接口是Spring资源访问的接口,具体的资源访问由该接口的实现类完成。Spring提供了Resource接口的大量实现类:

    UrlReource:访问网络资源的实现类    ClassPathResource:访问类加载路径里资源的实现类    FileSystemResource: 访问文件系统里的资源的实现类    ServletContextResource:访问相对于ServletContext路径下的资源的实现类,通常在WEB应用中使用    InputStreamResource:访问输入流资源的实现类    ByteArrayResource:访问字节数组资源的实现类

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

    1>ResourceLoader:该接口实现类的实例可以获得一个Resource实例,该接口里有如下方法:   Resource getResource(String location):该接口仅包含这个方法,该方法用于返回一个Resource实例。ApplicationContext的实现类都实现了ResourceLoader接口,因此ApplicationContext直接获取Resource实例    2>ResourceLoaderAware:该接口实现类的实例将获得一个ResourceLoader的引用。该接口包含一个方法:void setResourceLoader(ResourceLoader resourceLoader);该方法用于设置一个ResourceLoader实例。实现该接口的类之后,可以配置成Bean实例,我们不需要为该setter方法显式<property />设置参数传递,Spring容器会自动检测到实现ResourceLoaderAware接口的Bean类然后自动将自动传递给该参数作为ResourceLoader引用。

使用ResourceLoaderAware接口示例:

public class Simple implements ResourceLoaderAware {    private ResourceLoader resourceloader ;    @Override    public void setResourceLoader(ResourceLoader resourceLoader) {        this.resourceLoader = resourceLoader ;    }    public ResourceLoader getResourceLoader() {        return resourceLoader ;    }}//配置Spring.xml<beans ...>    <bean id="simple" class="Simple" /></beans>//测试主程序public class test {    public static void main(String[] args) {        ApplicationContext act = new ClassPathXmlApplicationContext("Spring.xml") ;        Simple simple = acr.getBean("simple",Simple.class) ;        //检测Spring容器是否自动传入ResourceLoader属性值        ResourceLoader rl = simple.getReourceLoader() ;        //控制台输出:true        System.out.println("Spring容器是否将自身传入成ResourceLoader值?: + (rl == act)) ;    }}
0 0