Вопрос проверяет понимание скрытых зависимостей и реального поведения контейнера Spring.
Бин с @Lazy будет создан сразу, если его явно запрашивают при старте контекста. Также это произойдёт, если он внедряется в не-lazy singleton без прокси. Некоторые инфраструктурные бины Spring тоже могут инициировать создание. @Lazy не является абсолютной гарантией отложенной инициализации. Контекст и зависимости могут её нарушить.
Аннотация @Lazy работает не изолированно, а в контексте всего контейнера.
Перед перечислением важно понимать, что Spring обязан создать бин, если без него невозможно корректно собрать контекст.
Если:
бин A — singleton
бин B — @Lazy
B внедряется напрямую в A
то B будет создан при инициализации A.
Примеры:
applicationContext.getBean(...)
Использование в @PostConstruct
Обращение в InitializingBean
Некоторые бины:
BeanPostProcessor
ApplicationListener
аспекты
могут быть созданы заранее, даже если помечены @Lazy.
@Lazy только на поле@Autowired
@Lazy
private HeavyService service;
Если прокси не создаётся:
бин может быть инициализирован сразу
@Lazy — это подсказка контейнеру, а не жёсткое правило. Реальное поведение зависит от:
графа зависимостей
способа внедрения
типа бина
Lazy-инициализация может быть нарушена зависимостями и инфраструктурой Spring. Всегда важно понимать, кто и когда запрашивает бин.