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.