Sobes.tech
Junior — Middle
82

В Spring, если Bean аннотирован как Lazy и внедряется в другой Bean, он будет инициализирован лениво?

Компании, где спрашивали
Firecode

Ответ от нейросети

sobes.tech AI

Если Bean в Spring аннотирован как @Lazy, то он будет инициализирован лениво, то есть только при первом обращении к нему. Однако, если такой ленивый Bean внедряется в другой Bean через обычное поле или конструктор, то по умолчанию Spring инициализирует его сразу при создании зависимого Bean.

Чтобы действительно добиться ленивой инициализации внедряемого Bean, нужно использовать прокси или внедрять его через ObjectFactory<T> или Provider<T>. Например:

@Component
@Lazy
public class LazyBean {
    public LazyBean() {
        System.out.println("LazyBean создан");
    }
}

@Component
public class EagerBean {
    private final LazyBean lazyBean;

    public EagerBean(LazyBean lazyBean) {
        this.lazyBean = lazyBean; // LazyBean создастся сразу при создании EagerBean
    }
}

// Чтобы лениво внедрять:
@Component
public class EagerBean {
    private final ObjectProvider<LazyBean> lazyBeanProvider;

    public EagerBean(ObjectProvider<LazyBean> lazyBeanProvider) {
        this.lazyBeanProvider = lazyBeanProvider;
    }

    public void useLazyBean() {
        LazyBean lazyBean = lazyBeanProvider.getIfAvailable(); // здесь LazyBean создастся при первом вызове
    }
}

Итого: аннотация @Lazy на Bean сама по себе не гарантирует ленивую инициализацию при внедрении, если не использовать специальные механизмы проксирования или провайдеры.