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
.
package example;
public class MyBean {
private Resource template;
public setTemplate(Resource template) {
this.template = template;
}
// ...
}
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.
@Component
public class MyBean {
private final Resource template;
public MyBean(@Value("${template.path}") Resource template) {
this.template = template;
}
// ...
}
@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
. .
@Component
public class MyBean {
private final Resource[] templates;
public MyBean(@Value("${templates.path}") Resource[] templates) {
this.templates = templates;
}
// ...
}
@Component
class MyBean(@Value("\${templates.path}") private val templates: Resource[])
GO TO FULL VERSION