Что такое BeanFactoryPostProcessor в Spring и для чего он нужен?

«Что такое BeanFactoryPostProcessor в Spring и для чего он нужен?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Когда использовать: Когда нужно программно изменить свойства, зависимости или даже класс бина, основываясь на внешней конфигурации или условиях.

Пример: Динамическое изменение свойства бина перед его созданием

@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 
            throws BeansException {
        // Получаем определение бина по его имени
        BeanDefinition beanDef = beanFactory.getBeanDefinition("dataSource");
        // Модифицируем его свойства
        beanDef.getPropertyValues().add("connectionTimeout", 30000);
        beanDef.getPropertyValues().add("maxPoolSize", 10);
    }
}
Ключевое отличие от BeanPostProcessor: BeanFactoryPostProcessor BeanPostProcessor
Работает с BeanDefinition (конфигурация, метаданные). Работает с готовым экземпляром объекта (bean instance).
Вызывается до создания бина (фаза инициализации контейнера). Вызывается после создания бина, но до/после его инициализации (init-methods).
Может изменять как бин будет создан. Может изменять или обернуть уже созданный бин (например, для проксирования).

Практическое применение: В Spring Boot BeanFactoryPostProcessor используется для обработки @ConfigurationProperties, регистрации бинов на основе условий (@Conditional) и в других механизмах расширения контейнера.