Spring 配置资源Resource

来源:互联网 时间:2016-11-09

Java中,不同来源的资源抽象成URL,通过注册不同的handler(URLStreamHandler)来处理不同来源的资源的读取逻辑。一般handler的类型使用不同的前缀(协议,protocal)来识别,如:“file:”、“http:“、”jar:”等。

 

对于Spring,URL没有定义相应的,如“classpath:“的handler,定义也相对麻烦,Spring对配置文件的读取做了相应的封装,通过Resource接口来抽象底层资源。如下:

/**

* Interface for a resource descriptor that abstracts from the actual

* type of underlying resource, such as a file or class path resource.

*

* <p>An InputStream can be opened for every resource if it exists in

* physical form, but a URL or File handle can just be returned for

* certain resources. The actual behavior is implementation-specific.

*

* @author Juergen Hoeller

* @since 28.12.2003

* @see #getInputStream()

* @see #getURL()

* @see #getURI()

* @see #getFile()

* @see WritableResource

* @see ContextResource

* @see FileSystemResource

* @see ClassPathResource

* @see UrlResource

* @see ByteArrayResource

* @see InputStreamResource

* @see PathResource

*/

public interface Resource extends InputStreamSource {

/**

* Return whether this resource actually exists in physical form.

* <p>This method performs a definitive existence check, whereas the

* existence of a {@code Resource} handle only guarantees a

* valid descriptor handle.

*/

boolean exists();

/**

* Return whether the contents of this resource can be read,

* e.g. via {@link #getInputStream()} or {@link #getFile()}.

* <p>Will be {@code true} for typical resource descriptors;

* note that actual content reading may still fail when attempted.

* However, a value of {@code false} is a definitive indication

* that the resource content cannot be read.

* @see #getInputStream()

*/

boolean isReadable();

/**

* Return whether this resource represents a handle with an open

* stream. If true, the InputStream cannot be read multiple times,

* and must be read and closed to avoid resource leaks.

* <p>Will be {@code false} for typical resource descriptors.

*/

boolean isOpen();

/**

* Return a URL handle for this resource.

* @throws IOException if the resource cannot be resolved as URL,

* i.e. if the resource is not available as descriptor

*/

URL getURL() throws IOException;

/**

* Return a URI handle for this resource.

* @throws IOException if the resource cannot be resolved as URI,

* i.e. if the resource is not available as descriptor

*/

URI getURI() throws IOException;

/**

* Return a File handle for this resource.

* @throws IOException if the resource cannot be resolved as absolute

* file path, i.e. if the resource is not available in a file system

*/

File getFile() throws IOException;

/**

* Determine the content length for this resource.

* @throws IOException if the resource cannot be resolved

* (in the file system or as some other known physical resource type)

*/

long contentLength() throws IOException;

/**

* Determine the last-modified timestamp for this resource.

* @throws IOException if the resource cannot be resolved

* (in the file system or as some other known physical resource type)

*/

long lastModified() throws IOException;

/**

* Create a resource relative to this resource.

* @param relativePath the relative path (relative to this resource)

* @return the resource handle for the relative resource

* @throws IOException if the relative resource cannot be determined

*/

Resource createRelative(String relativePath) throws IOException;

/**

* Determine a filename for this resource, i.e. typically the last

* part of the path: for example, "myfile.txt".

* <p>Returns {@code null} if this type of resource does not

* have a filename.

*/

String getFilename();

/**

* Return a description for this resource,

* to be used for error output when working with the resource.

* <p>Implementations are also encouraged to return this value

* from their {@code toString} method.

* @see Object#toString()

*/

String getDescription();

}

对于不同来源的资源文件都有相应的Resource实现,文件(FileSystemResource)、Classpath资源(ClassPathResource)、URL资源(UrlResource)、InputStream资源(InputStreamResource)、Byte数组资源(ByteArrayResource)等。

相关阅读:
Top