@PostConstruct не вызовется, если бин создан через new
Вопрос проверяет, понимаете ли вы, что жизненный цикл бина — это контракт с контейнером, а не с классом.
@PostConstruct обрабатывает CommonAnnotationBeanPostProcessor после того, как Spring создал объект и внедрил зависимости. Если объект появился не через контейнер — например, вызвали new MyService(dep) в фабричном методе, тесте или внутри конструктора другого бина — этот BeanPostProcessor до объекта не дотянется. Аннотация просто игнорируется, без исключений и предупреждений.
public class MyService {
@PostConstruct void init() { cache.warmUp(); } }
Код компилируется и работает — до первого обращения к прогретому кэшу, которого никто не прогрел.
Спросят, как гарантировать инициализацию без контейнера — вынести логику явно в конструктор либо реализовать InitializingBean.afterPropertiesSet(). Уточнят: второй вариант та же проблема, он тоже сработает только внутри Spring-контекста.
Аннотация — это не магия над классом, это договорённость с конкретным контейнером. Без контейнера договорённости никто не выполняет.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки