zoukankan      html  css  js  c++  java
  • Spring系列.Resource接口

    接口简介

    JDK中提供了java.net.URL这个类来用于获取不同种类的资源(根据不同前缀的url可以获取不同种类的资源)。但是URL这个类没有获取classpath和ServletContext下的资源的能力。因此Spring提供了Resource接口,用于获取各种资源。

    Resource接口

    spring中的org.springframework.core.io.Resource接口代表着物理存在的任何资源,其继承于org.springframework.core.io.InputStreamSource。

    Spring的资源接口是一个更强大的接口,用于抽象对低级资源的访问。

    Resource接口的主要方法如下:

    
    public interface Resource extends InputStreamSource {
    
    	boolean exists();
    	default boolean isReadable() {
    		return exists();
    	}
    	default boolean isOpen() {
    		return false;
    	}
    	default boolean isFile() {
    		return false;
    	}
    	URL getURL() throws IOException;
    	URI getURI() throws IOException;
    	File getFile() throws IOException;
    	default ReadableByteChannel readableChannel() throws IOException {
    		return Channels.newChannel(getInputStream());
    	}
    	long contentLength() throws IOException;
    	long lastModified() throws IOException;
    	Resource createRelative(String relativePath) throws IOException;
    	@Nullable
    	String getFilename();
    	String getDescription();
    }
    
    

    关于上面提供的getURI和getURL方法这边做下解释。URI用于唯一指定互联网上一个资源的名字,我们可以理解为一个资源的唯一id。URL代表一个资源的唯一地址,我们通过这个地址可以在互联网上寻找到这个资源。通常可以用URL来代替URI。

    Resource继承了InputStreamSource接口,下面是其定义:

    public interface InputStreamSource {
    
        InputStream getInputStream() throws IOException;
    
    }
    

    Resource的比较重要的方法如下:

    • getInputStream(): 定位和打开resource, 返回InputStream 来读取资源。每一次调用都会返回一个新的InputStream,调用者负责将其关闭。
    • exists(): 返回boolean,用来判断资源是否存在
    • isOpen(): 返回boolean,用来判断资源是不是已经存在一个open stream处理器。 true表明InputStream不能被多次读取,那么这次的读取会被关闭,以避免资源泄露。false是所有正常资源实现的返回,有可能会抛异常:InputStreamResource。
    • getDescription(): 返回资源的描述,用于错误输出。通常这会返回resource URL的全名。

    其他的方法可以让你获取到代表resource的URL或者File对象。

    Resource接口在Spring代码中非常常用,你也可以考虑应用到你的程序中。

    内置的Resource实现

    Spring中提供了很多Resource接口的实现类。主要有ByteArrayResource, ClassPathResource, DescriptiveResource, FileSystemResource, InputStreamResource, PortletContextResource, ServletContextResource和UrlResource。常用的有:

    • ClassPathResource:通过 ClassPathResource 以类路径的方式进行访问;
    • FileSystemResource:通过 FileSystemResource 以文件系统绝对路径的方式进行访问;
    • ServletContextResource:通过 ServletContextResource 以相对于Web应用根目录的方式进行访问。
    • UrlResource :通过java.net.URL来访问资源,当然它也支持File格式,如“file:”、“http:”。

    ResourceLoader接口

    ResourceLoader接口用来加载Resource资源。

    public interface ResourceLoader {
        Resource getResource(String location);
    }
    

    所有的ApplicationContext类都实现了ResourceLoader接口,所以我们可以使用context来加载resource。

    不同类型的ApplicationContext会返回不同的Resource。

    当你在特定的应用程序上下文上调用getResource(),并且指定的位置路径没有特定的前缀时,你将返回适合该特定应用程序上下文的资源类型。例如,假设对ClassPathXmlApplicationContext实例执行了以下代码片段:

    Resource template = ctx.getResource("some/resource/path/myTemplate.txt");
    

    ClassPathXmlApplicationContext返回ClassPathResource,FileSystemXmlApplicationContext返回FileSystemResource,WebApplicationContext返回ServletContextResource。 他会返回和ApplicationContext相对应的Resource实现。

    当然,你可以强制ClassPathResource使用,而不管ApplicationContext到底是什么。使用的方法就是在资源路径前面加前缀。

    Resource template1 = ctx.getResource("classpath:some/resource/path/myTemplate.txt");
    
    Resource template2 = ctx.getResource("http://myhost.com/resource/path/myTemplate.txt");
    
    Resource template3 = ctx.getResource("file:///some/resource/path/myTemplate.txt");
    
    Resource[] template4 = ctx.getResources("file:///some/resource/path/my**a.txt");
    
    

    ResourceLoaderAware接口

    ResourceLoaderAware接口是一个特殊的回调接口,表明该组件需要提供一个ResourceLoader的引用。 下面是ResourceLoaderAware的定义:

    public interface ResourceLoaderAware {
        void setResourceLoader(ResourceLoader resourceLoader);
    }
    

    一个Bean如果实现了ResourceLoaderAware接口,容器在加载Bean的时候会给这个Bean注入一个ResourceLoad实现类(容器设置的ResourceLoad就是容器本身,因为所有的Spring application contexts 都实现了ResourceLoader 接口),利用这个实现类也可以加载Resource资源。

    Resources as Dependencies

    不知道在讲什么,后续再整理。。。

    构造 ApplicationContext

    //从classpath下寻找配置文件构造ApplicationContext
    ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");
    //从当前工作目录寻找配置文件构造FileSystemXmlApplicationContext
    ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");
    //由于加了classpath前缀,所以从classpath下寻找配置构造FileSystemXmlApplicationContext
    ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:conf/appContext.xml");
    //以MessengerService类所在的路径为基准路径,寻找services.xml和daos.xml作为配置文件
    ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"}, MessengerService.class);
    

    通配符形式构造资源

    ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:conf/appContext.xml");
    
    人生的主旋律其实是苦难,快乐才是稀缺资源。在困难中寻找快乐,才显得珍贵~
  • 相关阅读:
    eclipse中注释模板的修改
    Oracle 解锁Record is locked by another user
    Oracle 解锁Record is locked by another user
    提高网站速度的最佳实践
    Tomcat中配置SSL
    CentOS QQ
    csshack
    文件contentType
    JavaScript实现Iframe自适应其加载的内容高度
    转timer
  • 原文地址:https://www.cnblogs.com/54chensongxia/p/13094454.html
Copyright © 2011-2022 走看看