Для чего используется аннотация @Lazy в Spring?

«Для чего используется аннотация @Lazy в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Аннотация @Lazy в Spring управляет ленивой инициализацией бинов. Она откладывает создание экземпляра до момента его первого фактического запроса, а не на этапе запуска контекста приложения.

Основные сценарии применения:

  1. Оптимизация времени запуска: Для ресурсоемких бинов (например, подключающихся к удаленным сервисам или загружающих большие объемы данных), которые могут не потребоваться сразу.
  2. Разрешение циклических зависимостей: Помогает разорвать цикл 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, так как они по умолчанию создаются лениво при каждом запросе.