El contexto de Spring ofrece características de acceso a bajo de nivel de recursos más alla de las ofrecidas por la clase java.net.URL estándar de Java.

Interface

Toda la gestión de recursos recae en la interface Resource, que extiende InputStreamSource, y actúa como un wrapper de java.net.URL:

El método getInputStream es el que se encarga de localizar y dar acceso físico a los recursos, aunque es responsabilidad de la aplicación cerrar el stream una vez haya terminado de operar con él.

La disponibilidad de los métodos getURL y getFile dependen del tipo y ubicación del recurso concreto solicitado. Por ejemplo, una petición HTTP a un servidor remoto normalmente no se puede resolver como una instancia de java.io.File.

Spring recomienda utilizar la interface Resource en las aplicaciones, como cualquier otra librería de utilidades, aunque ello suponga añadir una dependencia por código con Spring.

Implementaciones

Spring proporciona varias implementaciones para la interface Resource que pueden instanciarse directamente para acceder a un recurso:

UrlResource: La implementación genérica que funciona como java.net.URL. Admite una URL válida como parámetro con cualquier tipo de prefijo habitual: “file:”, “http:”, “ftp:”, …

ClassPathResource: Una implementación específica para acceder a recursos que se encuentran dentro del classpath.

FileSystemResource: Una implementación específica para acceder a recursos dentro de un sistema de ficheros.

ServletContextResource: Una implementación específica para acceder a recursos de una aplicación web relativos a su directorio de despliegue.

InputStreamResource: Una implementación específica para tratar con recursos que se encuentren ya abiertos y accesibles a través de InputStream.

ByteArrayResource: Una implementación específica para acceder a un array de bytes que se encuentre ya disponible.

Contexto

El contexto implementa el método getResource que permite acceder a los recursos. El tipo de objeto concreto devuelto por este método será una de las implementaciones indicadas en el apartado anterior en función de la URL dada:

De la forma acostumbrada, Spring proporciona una interface Aware que cualquier bean que quiera acceder a ese aspecto del contexto puede implementar:

Aunque por supuesto se puede utilizar cualquier otro medio de inyección de dependencias de Spring para obtener acceso al cargador de recursos, como la anotación @Autowired por ejemplo.

Carga por Dependencia

Si un recurso sólo se va cargar de forma puntual en un bean, no hace falta tener acceso a la interface, basta con inyectar el recurso directamente en una propiedad del bean.

Wildcards

Spring deja también especificar wildcards (caracteres comodines), pero sólo tiene sentido en algunos casos concretos.

Por ejemplo, usando classpath*: cuando se quiere instanciar un ApplicationContext a partir de varios ficheros de configuración ubicados en el classpath, y evitar así tener que especificarlos todos uno a uno:

O usando ** cuando se quiere buscar en subdirectorios a partir de un raíz dada:

No todas las combinaciones son válidas, ni dan el resultado esperado, además de ciertos problemas de compatibilidad. Lo mejor es revisar la documentación oficial en cada caso.