Built-in Resource Implementations
Spring includes the following Resource
implementations:
UrlResource
UrlResource
wraps a java.net.URL
and can be used to access any object that is
normally accessible with a URL, such as files, an HTTP target, an FTP target, and others. All
URLs have a standardized String
representation, such that appropriate standardized
prefixes are used to indicate one URL type from another. This includes file:
for
accessing filesystem paths, http:
for accessing resources through the HTTP protocol,
ftp:
for accessing resources through FTP, and others.
A UrlResource
is created by Java code by explicitly using the UrlResource
constructor
but is often created implicitly when you call an API method that takes a String
argument meant to represent a path. For the latter case, a JavaBeans
PropertyEditor
ultimately decides which type of Resource
to create. If the path
string contains well-known (to it, that is) prefix (such as classpath:
), it
creates an appropriate specialized Resource
for that prefix. However, if it does not
recognize the prefix, it assume the string is a standard URL string and
creates a UrlResource
.
ClassPathResource
This class represents a resource that should be obtained from the classpath. It uses either the thread context class loader, a given class loader, or a given class for loading resources.
This Resource
implementation supports resolution as java.io.File
if the class path
resource resides in the file system but not for classpath resources that reside in a
jar and have not been expanded (by the servlet engine or whatever the environment is)
to the filesystem. To address this, the various Resource
implementations always support
resolution as a java.net.URL
.
A ClassPathResource
is created by Java code by explicitly using the ClassPathResource
constructor but is often created implicitly when you call an API method that takes a
String
argument meant to represent a path. For the latter case, a JavaBeans
PropertyEditor
recognizes the special prefix, classpath:
, on the string path and
creates a ClassPathResource
in that case.
FileSystemResource
This is a Resource
implementation for java.io.File
and java.nio.file.Path
handles.
It supports resolution as a File
and as a URL
.
ServletContextResource
This is a Resource
implementation for ServletContext
resources that interprets
relative paths within the relevant web application’s root directory.
It always supports stream access and URL access but allows java.io.File
access only
when the web application archive is expanded and the resource is physically on the
filesystem. Whether or not it is expanded and on the filesystem or accessed
directly from the JAR or somewhere else like a database (which is conceivable) is actually
dependent on the Servlet container.
InputStreamResource
An InputStreamResource
is a Resource
implementation for a given InputStream
. It should be used only if no
specific Resource
implementation is applicable. In particular, prefer
ByteArrayResource
or any of the file-based Resource
implementations where possible.
In contrast to other Resource
implementations, this is a descriptor for an already-opened
resource. Therefore, it returns true
from isOpen()
. Do not use it if you need
to keep the resource descriptor somewhere or if you need to read a stream multiple
times.