Если бин будет самостоятельно определять и предоставлять путь к ресурсам посредством какого-то динамического процесса, вероятно, имеет смысл использовать интерфейс ResourceLoader
или ResourcePatternResolver
для загрузки ресурсов. Например, рассмотрим загрузку какого-либо шаблона, где конкретный необходимый ресурс зависит от роли пользователя. Если ресурсы статичны, то имеет смысл полностью отказаться от использования интерфейса ResourceLoader
(или интерфейса ResourcePatternResolver
), пусть бин открывает свойства Resource
, которые ему нужны, и ожидает, что они будут внедрены в него.
Что делает тривиальным последующее внедрение этих свойств, так это то, что все контексты приложений регистрируют и используют специальный PropertyEditor
класса JavaBeans, который может преобразовывать String
пути в объекты Resource
. Например, следующий класс MyBean
имеет свойство template
типа Resource
.
package example;
public class MyBean {
private Resource template;
public setTemplate(Resource template) {
this.template = template;
}
// ...
}
class MyBean(var template: Resource)
В XML-файле конфигурации свойство template
может быть сконфигурировано простой строкой для данного ресурса, как показано в следующем примере:
<bean id="myBean" class="example.MyBean">
<property name="template" value="some/resource/path/myTemplate.txt"/>
</bean>
Обратите внимание, что путь к ресурсу не имеет префикса. Следовательно, поскольку сам контекст приложения будет использоваться в качестве ResourceLoader
, ресурс загружается через ClassPathResource
, FileSystemResource
или ServletContextResource
в зависимости от точного типа контекста приложения.
Если нужно принудительно использовать определенный тип Resource
, то можно использовать префикс. В следующих двух примерах показано, как принудительно использовать ClassPathResource
и UrlResource
(последний используется для доступа к файлу в файловой системе):
<property name="template" value="classpath:some/resource/path/myTemplate.txt">
<property name="template" value="file:///some/resource/path/myTemplate.txt"/>
Если класс MyBean
рефакторингован (перепроектирован) для использования с конфигурацией, управляемой аннотациями, путь к myTemplate.txt
может быть сохранен в ключе с именем template.path
– например, в файле свойств, доступном для Environment
в Spring. Затем на путь шаблона можно сослаться с помощью аннотации @Value
, используя плейсхолдер свойства. Spring получит значение пути шаблона в виде строки, а специальный PropertyEditor
преобразует строку в объект Resource
, который будет внедрен в конструктор MyBean
. В следующем примере показано, как этого добиться.
@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)
Если мы хотим организовать поддержку нескольких шаблонов, обнаруженных по одному и тому же пути в нескольких местах в пути классов – например, в нескольких банках в пути классов - мы можем использовать специальный префикс classpath*:
и подстановочные знаки, чтобы определить ключ templates.path
как classpath*:/config/templates/*.txt
. Если мы переопределим класс MyBean
следующим образом, Spring преобразует шаблон пути к шаблону в массив объектов Resource
, который можно внедрить в конструктор 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[])
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ