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.
Вопросы для повторения
- Aware делает объект bean? Нет, callback применяется к уже создаваемому bean.
- Когда вызывается callback? Во время инициализации контейнером, до стандартных init-методов.
- Почему
ApplicationContextAwareиспользуют редко? Он связывает класс со всем контейнером и скрывает реальные зависимости. - Можно ли внедрить инфраструктурный интерфейс обычным DI? Часто да, и это проще тестировать.
Связано: Spring Context, Способы внедрения зависимостей Spring.