@PostConstruct не вызовется, если бин создан через new

Вопрос проверяет, понимаете ли вы, что жизненный цикл бина — это контракт с контейнером, а не с классом.

@PostConstruct обрабатывает CommonAnnotationBeanPostProcessor после того, как Spring создал объект и внедрил зависимости. Если объект появился не через контейнер — например, вызвали new MyService(dep) в фабричном методе, тесте или внутри конструктора другого бина — этот BeanPostProcessor до объекта не дотянется. Аннотация просто игнорируется, без исключений и предупреждений.

public class MyService {

@PostConstruct void init() { cache.warmUp(); } }

Код компилируется и работает — до первого обращения к прогретому кэшу, которого никто не прогрел.

Спросят, как гарантировать инициализацию без контейнера — вынести логику явно в конструктор либо реализовать InitializingBean.afterPropertiesSet(). Уточнят: второй вариант та же проблема, он тоже сработает только внутри Spring-контекста.

Аннотация — это не магия над классом, это договорённость с конкретным контейнером. Без контейнера договорённости никто не выполняет.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки