# 2.3. Built-in Resource Implementations
Spring includes the following Resource
implementations:
UrlResource
ClassPathResource
FileSystemResource
ServletContextResource
InputStreamResource
ByteArrayResource
# 2.3.1. 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
.
# 2.3.2.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.
# 2.3.3.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
.
# 2.3.4.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.
# 2.3.5.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.
# 2.3.6.ByteArrayResource
This is a Resource
implementation for a given byte array. It creates a ByteArrayInputStream
for the given byte array.
It is useful for loading content from any given byte array without having to resort to a single-use InputStreamResource
.