Якщо бін самостійно визначатиме і надаватиме шлях до ресурсів за допомогою якогось динамічного процесу, ймовірно, має сенс використовувати інтерфейс ResourceLoader або ResourcePatternResolver для завантаження ресурсів. Наприклад, розглянемо завантаження будь-якого шаблону, де конкретний ресурс залежить від ролі користувача. Якщо ресурси статичні, то є сенс повністю відмовитися від використання інтерфейсу ResourceLoader (або інтерфейсу ResourcePatternResolver). Нехай бін відкриває властивості Resource, які йому потрібні, і очікує, що їх буде впроваджено до нього.

Що робить тривіальним подальше впровадження цих властивостей, так це те, що всі контексти додатків реєструють і використовують спеціальний PropertyEditor класу JavaBeans, який може перетворювати String шляхи на об'єкти Resource. Наприклад, наступний клас MyBean має властивість template типу Resource.

Java
package example;
public class MyBean {
    private Resource template;
    public setTemplate(Resource template) {
        this.template = template;
    }
    // ...
}
Kotlin
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. У цьому прикладі показано, як цього досягти.

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)

Якщо ми хочемо організувати підтримку кількох шаблонів, виявлених за одним і тим самим шляхом у кількох місцях у шляху класів — наприклад, у кількох банках у шляху класів — ми можемо використовувати спеціальний префікс classpath*: та знаки для встановлення ключа templates.path як classpath*:/config/templates/*.txt. Якщо ми перевизначимо клас MyBean таким чином, Spring перетворює шаблон шляху до шаблону на масив об'єктів Resource, який можна впровадити до конструктора 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[])