Ответ
Не всегда. Ленивая инициализация (@Lazy) сохраняется только если и принимающий бин (клиент), и контекст внедрения настроены соответствующим образом. В противном случае Spring создаст зависимый бин во время создания бина-клиента.
Правила и сценарии:
-
Внедрение через конструктор (по умолчанию не ленивое): Если бин-клиент не является
@Lazy, Spring создаст ленивый бин-зависимость во время создания клиента, так как ему нужен готовый аргумент для конструктора.@Component class Client { private final Service service; // Service будет создан НЕМЕДЛЕННО при создании Client! public Client(@Lazy Service service) { this.service = service; } } -
Внедрение через поле или setter-метод: Ленивая зависимость будет создана только при первом обращении к полю/методу.
@Component class Client { @Autowired @Lazy // Прокси внедряется сразу, реальный объект Service создастся при первом вызове private Service service; } -
Полностью ленивая цепочка: Чтобы и клиент, и его зависимость инициализировались лениво, нужно аннотировать
@Lazyоба бина.@Configuration class AppConfig { @Bean @Lazy public Service service() { return new Service(); } @Bean @Lazy // Client и его зависимость Service создадутся только при первом обращении public Client client(Service service) { return new Client(service); } }
Ключевой вывод: Аннотация @Lazy создаёт прокси-объект. Момент инициализации реального объекта зависит от способа и контекста внедрения.