Если бин будет самостоятельно определять и предоставлять путь к ресурсам посредством какого-то динамического процесса, вероятно, имеет смысл использовать интерфейс 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[])