Si el bean determina y proporciona de forma independiente la ruta a los recursos a través de algún proceso dinámico, probablemente tenga sentido usar la interfaz ResourceLoader o ResourcePatternResolver para cargar recursos. Por ejemplo, considere cargar una plantilla donde el recurso específico necesario dependa del rol del usuario. Si los recursos son estáticos, entonces tiene sentido abandonar por completo el uso de la interfaz ResourceLoader (o la interfaz ResourcePatternResolver), dejar que el bean exponga el Recurso propiedades que necesita y espera que estén integradas en él.

Lo que hace que sea trivial implementar posteriormente estas propiedades es que todos los contextos de aplicación registran y utilizan una clase JavaBeans PropertyEditor especial que puede convertir rutas String en objetos Recurso. Por ejemplo, la siguiente clase MyBean tiene una propiedad template de tipo Resource.

Java
package example;
public class MyBean {
    private Resource template;
    public setTemplate(Resource template) {
        this.template = template;
    }
    // ...
}
Kotlin
class MyBean(var template: Resource)

En un archivo de configuración XML, la propiedad template se puede configurar con una cadena simple para un recurso determinado, como se muestra en el siguiente ejemplo:


<bean id="myBean" class="example.MyBean">
    <property name="template" value="some/resource/path/myTemplate.txt"/>
    

Tenga en cuenta que la ruta del recurso no tiene prefijo. Por lo tanto, dado que el contexto de la aplicación en sí se utilizará como ResourceLoader, el recurso se carga a través de ClassPathResource, FileSystemResource o ServletContextResource dependiendo del tipo exacto de contexto de la aplicación.

Si necesita forzar el uso de un tipo de Recurso específico, puede utilizar un prefijo. Los dos ejemplos siguientes muestran cómo forzar el uso de ClassPathResource y UrlResource (este último se utiliza para acceder a un archivo en el sistema de archivos):

<property name="template" value="classpath:some/resource/path/myTemplate.txt">
<property name="template" value="file:///some/resource/path/myTemplate.txt"/>

Si la clase MyBean se refactoriza (rediseña) para usarla con una configuración basada en anotaciones, la ruta a myTemplate.txt se puede almacenar en una clave denominada template.path : por ejemplo, en el archivo de propiedades disponible para Environment en Spring. Luego se puede hacer referencia a la ruta de la plantilla con la anotación @Value utilizando el marcador de posición de propiedad. Spring recibirá el valor de la ruta de la plantilla como una cadena, y un PropertyEditor especial convertirá la cadena en un objeto Resource, que se inyectará en MyBean constructor. El siguiente ejemplo muestra cómo lograr esto.

Java
@Component
public class MyBean {
    private final Resource template;
    public MyBean(@Value("${template.path}") Resource template) {
        this.template = template;
    }
    // ...
}
Kotlin
@Component
class MyBean(@Value("\${template.path}") private val template: Resource)

Si queremos admitir varias plantillas encontradas en la misma ruta en varios lugares del classpath (por ejemplo, en varios archivos jar del classpath), podemos usar un prefijo especial classpath*: y comodines. para definir la clave templates.path como classpath*:/config/templates/*.txt. Si anulamos la clase MyBean de la siguiente manera, Spring convierte la plantilla de ruta de la plantilla en una matriz de objetos Resource que se pueden inyectar en el constructor MyBean. .

Java
@Component
public class MyBean {
    private final Resource[] templates;
    public MyBean(@Value("${templates.path}") Resource[] templates) {
        this.templates = templates;
    }
    // ...
}
Kotlin
@Component
class MyBean(@Value("\${templates.path}") private val templates: Resource[])