Вопрос проверяет понимание жизненного цикла бинов и механизмов оптимизации старта приложения.
Lazy-инициализация означает, что бин создаётся не при старте контекста, а при первом обращении к нему. Аннотация @Lazy указывает Spring отложить создание бина. Это позволяет ускорить старт приложения и не создавать ненужные объекты. По умолчанию все singleton-бины инициализируются eagerly. @Lazy меняет это поведение.
По умолчанию Spring старается создать все singleton-бины как можно раньше.
Lazy-инициализация — это режим, при котором бин создаётся только в момент первого использования, а не при старте контекста.
@LazyАннотацию можно применять в разных местах.
@Lazy
@Component
class HeavyService {
}
Поведение:
Контекст стартует без создания бина
При первом запросе бин создаётся
Далее используется как обычный singleton
@Configuration
@Lazy
class AppConfig {
}
Поведение:
Все бины внутри становятся lazy по умолчанию
@Autowired
@Lazy
private HeavyService heavyService;
В этом случае:
Внедряется прокси
Реальный бин создаётся при первом вызове
Ускорение старта приложения
Экономия памяти
Отложенная инициализация тяжёлых ресурсов
Ошибки проявляются позже
Первый вызов может быть медленным
Сложнее отлаживать
@Lazy полезна для тяжёлых или редко используемых бинов, но не должна применяться повсеместно без причины.