В чем разница между BeanFactoryPostProcessor и BeanPostProcessor в Spring

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

Ответ

BeanFactoryPostProcessor и BeanPostProcessor — это интерфейсы Spring для модификации контекста приложения, но работают на разных этапах.

BeanFactoryPostProcessor:

  • Работает с метаданными бинов до их создания.
  • Может изменять конфигурацию (BeanDefinition), например, свойства или scope.
  • Пример: PropertySourcesPlaceholderConfigurer для подстановки значений из properties-файлов.
@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        BeanDefinition bd = beanFactory.getBeanDefinition("myBean");
        bd.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE);
    }
}

BeanPostProcessor:

  • Работает с экземплярами бинов после их создания (но до инициализации/после).
  • Может модифицировать или обернуть бин (например, для проксирования).
  • Пример: AutowiredAnnotationBeanPostProcessor для внедрения зависимостей.
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        if (bean instanceof MyService) {
            // Логика до init-метода
        }
        return bean;
    }
}

Ключевое отличие:
BeanFactoryPostProcessor — настройка метаданных бинов, BeanPostProcessor — работа с готовыми экземплярами.