Ответ
Spring вызывает методы BeanPostProcessor до методов, помеченных @PostConstruct.
Полный порядок инициализации бина в Spring:
- Создание экземпляра (вызов конструктора).
- Внедрение зависимостей (популяция полей, аннотированных
@Autowired,@Resourceи т.д.). BeanPostProcessor.postProcessBeforeInitialization()— вызывается для каждого бина.- Методы инициализации бина:
- Методы, указанные в
@Bean(initMethod="..."). - Методы, реализующие
InitializingBean.afterPropertiesSet(). - Методы, аннотированные
@PostConstruct.
- Методы, указанные в
BeanPostProcessor.postProcessAfterInitialization()— вызывается для каждого бина.
Пример, демонстрирующий порядок:
@Component
public class ExampleBean {
@PostConstruct
public void init() {
System.out.println("3. @PostConstruct method");
}
}
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("2. BeanPostProcessor: before initialization");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("4. BeanPostProcessor: after initialization");
return bean;
}
}
// Вывод в консоль:
// 1. Constructor call (не показан)
// 2. BeanPostProcessor: before initialization
// 3. @PostConstruct method
// 4. BeanPostProcessor: after initialization