Junior — Middle
92
No Spring, se um Bean estiver anotado como Lazy e for injetado em outro Bean, ele será inicializado de forma preguiçosa?
Empresas quando solicitadas
Firecode
Resposta da IA
sobes.tech IA
Если 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 сама по себе не гарантирует ленивую инициализацию при внедрении, если не использовать специальные механизмы проксирования или провайдеры.