Aware-интерфейсы

Aware callbacks позволяют bean получить объект инфраструктуры Spring во время инициализации.

Примеры:

  • BeanNameAware;
  • BeanFactoryAware;
  • ApplicationContextAware;
  • EnvironmentAware;
  • ResourceLoaderAware;
  • ApplicationEventPublisherAware.
class ReportLoader implements ResourceLoaderAware {
    private ResourceLoader resourceLoader;
 
    @Override
    public void setResourceLoader(ResourceLoader loader) {
        this.resourceLoader = loader;
    }
}

Callback выполняется контейнером после заполнения обычных свойств и до init-callback. Точный порядок см. Жизненный цикл бина.

Когда использовать

Aware уместен в инфраструктурном компоненте, которому действительно нужен контейнерный контракт. Бизнес-сервису лучше внедрить узкую зависимость:

  • вместо ApplicationContextAware — конкретный сервис или ObjectProvider;
  • вместо EnvironmentAware — типизированные properties;
  • вместо ApplicationEventPublisherAware — ApplicationEventPublisher через конструктор.

Чрезмерный доступ к ApplicationContext скрывает зависимости и превращается в service locator.

Вопросы для повторения

  1. Aware делает объект bean? Нет, callback применяется к уже создаваемому bean.
  2. Когда вызывается callback? Во время инициализации контейнером, до стандартных init-методов.
  3. Почему ApplicationContextAware используют редко? Он связывает класс со всем контейнером и скрывает реальные зависимости.
  4. Можно ли внедрить инфраструктурный интерфейс обычным DI? Часто да, и это проще тестировать.

Связано: Spring Context, Способы внедрения зависимостей Spring.