Якщо бін самостійно визначатиме і надаватиме шлях до ресурсів за допомогою якогось динамічного процесу, ймовірно, має
сенс використовувати інтерфейс 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[])
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ