Если два класса обращаются к одному и тому же экземпляру бина, создастся ли при этом два отдельных объекта?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Нет, если два класса получают один и тот же бин из контейнера, обычно это будет один и тот же объект. По умолчанию в Spring бины имеют singleton-область видимости. Два разных класса могут ссылаться на один экземпляр и работать с ним совместно.
Определение:
В Spring бин — это объект, которым управляет контейнер. Если у бина область видимости singleton, контейнер создает один экземпляр на весь контекст приложения и возвращает на него ссылку при каждом запросе. Поэтому несколько классов, внедряющих этот бин, будут использовать один и тот же объект.
Пример использования:
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
@Component
class ServiceA {
@Autowired
private Counter counter;
}
@Component
class ServiceB {
@Autowired
private Counter counter;
}
@Component
class Counter {
private int value = 0;
public void increment() {
value++;
}
public int getValue() {
return value;
}
}
В этом примере ServiceA и ServiceB получат ссылку на один и тот же объект Counter, если у него стандартная область видимости singleton.
Пояснение кода:
Код показывает три компонента Spring. Counter — бин, который хранит состояние. ServiceA и ServiceB внедряют его через @Autowired. При старте контейнер создает один экземпляр Counter и передает одну и ту же ссылку в оба сервиса. Если ServiceA вызовет counter.increment(), изменение увидит и ServiceB, потому что объект общий.
Ключевые моменты:
- По умолчанию Spring создает один экземпляр бина на контекст приложения.
- Если два класса внедряют один и тот же бин, они получают ссылку на один объект, а не два.
- Исключения возможны при других scope, например
prototypeили web-scopes. - Если бин хранит изменяемое состояние, это важно учитывать с точки зрения потокобезопасности.
- Важно различать «один экземпляр в контейнере» и «один объект на каждый
new» — Spring обычно не используетnewнапрямую для внедрения.