На каком этапе жизненного цикла бина в Spring вызывается BeanFactoryPostProcessor?

Ответ

BeanFactoryPostProcessor выполняется на этапе конфигурации контейнера, до создания экземпляров бинов (инстанцирования).

Последовательность этапов:

  1. Загрузка метаданных бинов (BeanDefinition).
  2. Вызов всех BeanFactoryPostProcessor — они могут модифицировать эти метаданные.
  3. Создание экземпляров бинов (инстанцирование).
  4. Внедрение зависимостей (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 — с уже созданными экземплярами бинов.