Sobes.tech
Назад к вопросам
Junior — Middle
52

Если два класса обращаются к одному и тому же экземпляру бина, создастся ли при этом два отдельных объекта?

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

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 напрямую для внедрения.