Back to questions
Junior — Middle
58
В Spring, если Bean аннотирован как Lazy и внедряется в другой Bean, он будет инициализирован лениво?
Companies where asked
Firecode
Answer from AI
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 сама по себе не гарантирует ленивую инициализацию при внедрении, если не использовать специальные механизмы проксирования или провайдеры.