Что такое Bean Factory Processor и Bean Factory Post Processor, для чего они используются и что можно сделать с их помощью
-
Интерфейс:
public interface BeanFactoryPostProcessor { void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory); }
-
Вызывается после загрузки всех
BeanDefinition, но до создания бинов. -
То есть работает с метаданными (BeanDefinition), а не с самими объектами.
-
Изменение конфигурации перед созданием бинов:
- правка свойств (
BeanDefinition), - замена классов,
- регистрация новых
BeanDefinition, - чтение/обработка кастомных аннотаций.
- правка свойств (
-
PropertySourcesPlaceholderConfigurer (обрабатывает
${...}в@Value). -
Custom BeanDefinitionRegistryPostProcessor для добавления динамических бинов.
-
Подмена класса реализации:
beanFactory.getBeanDefinition("service") .setBeanClass(AlternativeService.class);
-
Интерфейс:
public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName); Object postProcessAfterInitialization(Object bean, String beanName); }
-
Вызывается для каждого созданного бина:
- до вызова
@PostConstruct/afterPropertiesSet(), - после инициализации.
- до вызова
- Изменение/обёртка самого бина.
- Можно вернуть оригинальный бин или заменить на прокси.
- AutowiredAnnotationBeanPostProcessor — внедряет зависимости по
@Autowired. - TransactionalAnnotationBeanPostProcessor — оборачивает бин в транзакционный прокси.
- AsyncAnnotationBeanPostProcessor — оборачивает бин в async-прокси.
- Кастомная логика: логирование создания бинов, внедрение дополнительных зависимостей, подмена поведения.
| Характеристика | BeanFactoryPostProcessor | BeanPostProcessor |
|---|---|---|
| Когда вызывается | До создания бинов | При создании каждого бина |
| Работает с | BeanDefinition (метаданные) |
С объектом бина |
| Уровень | «Метаданные конфигурации» | «Runtime объект» |
| Типичные задачи | Изменить конфигурацию, добавить бины | Обернуть бин в прокси, внедрить зависимости |
| Примеры | PropertySourcesPlaceholderConfigurer | Autowired, Async, Transactional, Cacheable |
- Подвид
BeanFactoryPostProcessor. - Даёт доступ к
BeanDefinitionRegistry→ можно регистрировать новые бины программно. - Используется в Spring Boot Autoconfiguration (например, чтобы подтянуть классы через
@Conditional).
-
BeanFactoryPostProcessor работает на уровне конфигурации: изменяет
BeanDefinitionдо создания бинов.- Пример: PropertyPlaceholderConfigurer, динамическая регистрация бинов.
-
BeanPostProcessor работает на уровне объектов: перехватывает каждый бин при создании.
- Пример: внедрение зависимостей, создание прокси (
@Transactional,@Async,@Cacheable).
- Пример: внедрение зависимостей, создание прокси (
-
Разница: один меняет чертёж (BeanDefinition), другой — готовый объект.
-
Для расширения Spring чаще всего создают BeanPostProcessor (AOP, прокси).
-
Для фреймворков и сложных интеграций → BeanFactoryPostProcessor (динамическая конфигурация).