Интерфейс ResourceLoaderAware – это специальный интерфейс обратного вызова, который идентифицирует компоненты, принимающие предоставляемую им ссылку на ResourceLoader. В следующем листинге показано определение интерфейса ResourceLoaderAware:

public interface ResourceLoaderAware {
    void setResourceLoader(ResourceLoader resourceLoader);
}

Если класс реализует ResourceLoaderAware и развертывается в контексте приложения (как управляемый бин Spring), он распознается как ResourceLoaderAware контекстом приложения. Затем контекст приложения обращается к setResourceLoader(ResourceLoader), предоставляя себя в качестве аргумента (помните, что все контексты приложений в Spring реализуют интерфейс ResourceLoader).

Поскольку ApplicationContext является ResourceLoader, бин может также реализовать интерфейс ApplicationContextAware и использовать предоставленный контекст приложения непосредственно для загрузки ресурсов. Однако, в целом, лучше использовать специализированный интерфейс ResourceLoader, если это все, что требуется. Код будет связан только с интерфейсом загрузки ресурсов (который можно считать служебным интерфейсом), а не со всем интерфейсом Spring ApplicationContext.

В компонентах приложения также можно положиться на автоматическое обнаружение и связывание ResourceLoader в качестве альтернативы реализации интерфейса ResourceLoaderAware. Традиционные режимы автоматического обнаружения и связывания constructor и byType способны предоставлять ResourceLoader либо для аргумента конструктора, либо для параметра сеттера, соответственно. Для большей гибкости (включая возможность автоматического обнаружения и связывания полей и методов с несколькими параметрами) рассмотрим возможность использования функций автоматического обнаружения и связывания на основе аннотаций. В этом случае ResourceLoader автоматически обнаруживается и связывается с полем, аргументом конструктора или параметром метода, который ожидает тип ResourceLoader, если поле, конструктор или метод содержат аннотацию @Autowired.

Чтобы загрузить один или несколько объектов Resource для пути к ресурсу, который содержит подстановочные знаки или использует специальный префикс ресурса classpath*:, вместо ResourceLoader с компонентами приложения следует связать экземпляр ResourcePatternResolver.