Ответ
Аннотация @Lazy в Spring управляет ленивой инициализацией бинов. Она откладывает создание экземпляра до момента его первого фактического запроса, а не на этапе запуска контекста приложения.
Основные сценарии применения:
- Оптимизация времени запуска: Для ресурсоемких бинов (например, подключающихся к удаленным сервисам или загружающих большие объемы данных), которые могут не потребоваться сразу.
- Разрешение циклических зависимостей: Помогает разорвать цикл
BeanCurrentlyInCreationException, когда два бина требуют друг друга при создании. Один из них можно сделать ленивым.
Способы применения:
- На уровне бина в конфигурации:
@Configuration public class AppConfig { @Bean @Lazy public ExpensiveService expensiveService() { return new ExpensiveService(); // Создастся при первом @Autowired или getBean() } } - На уровне класса компонента:
@Lazy @Service public class HeavyCalculationService { ... } - На уровне внедрения (только для конкретной инъекции):
@Component public class MyClient { @Lazy @Autowired private ExpensiveService service; // Прокси внедряется сразу, реальный бин — при первом вызове метода }
Важно: @Lazy не имеет эффекта для бинов с областью видимости prototype, так как они по умолчанию создаются лениво при каждом запросе.