Ответ
BeanFactoryPostProcessor выполняется на этапе конфигурации контейнера, до создания экземпляров бинов (инстанцирования).
Последовательность этапов:
- Загрузка метаданных бинов (
BeanDefinition). - Вызов всех
BeanFactoryPostProcessor— они могут модифицировать эти метаданные. - Создание экземпляров бинов (инстанцирование).
- Внедрение зависимостей (DI), вызов
@PostConstructи т.д.
Для чего это нужно? Чтобы программно изменять свойства бинов (scope, значения property, init-method) до того, как они будут созданы.
Практический пример:
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition bd = beanFactory.getBeanDefinition("myServiceBean");
// Динамически меняем scope бина на prototype
bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
// Или добавляем property значение
MutablePropertyValues values = bd.getPropertyValues();
values.add("timeout", 5000);
}
}
Важно: BeanFactoryPostProcessor работает с фабрикой бинов (BeanFactory), а BeanPostProcessor — с уже созданными экземплярами бинов.