В каком порядке Spring вызывает BeanPostProcessor и методы с аннотацией @PostConstruct?

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

Ответ

Spring вызывает методы BeanPostProcessor до методов, помеченных @PostConstruct.

Полный порядок инициализации бина в Spring:

  1. Создание экземпляра (вызов конструктора).
  2. Внедрение зависимостей (популяция полей, аннотированных @Autowired, @Resource и т.д.).
  3. BeanPostProcessor.postProcessBeforeInitialization() — вызывается для каждого бина.
  4. Методы инициализации бина:
    • Методы, указанные в @Bean(initMethod="...").
    • Методы, реализующие InitializingBean.afterPropertiesSet().
    • Методы, аннотированные @PostConstruct.
  5. 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