Junior — Middle
93
Spring'de, eğer Bean Lazy olarak işaretlenmiş ve başka bir Bean'e enjekte ediliyorsa, tembelce mi başlatılır?
Sorulan şirketler
Firecode
AI'dan gelen yanıt
sobes.tech yapay zeka
Если 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 сама по себе не гарантирует ленивую инициализацию при внедрении, если не использовать специальные механизмы проксирования или провайдеры.