Middle+
66
questionbank

Как себя поведёт прототипный бин в рамках синглтона?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Бин с областью видимости prototype, внедренный (инжектированный) в синглтон-бин, будет создан один раз при инициализации синглтона и далее использован многократно (одна и та же его копия) при каждом обращении к нему из синглтона. Spring создает прототипный бин при каждом запросе к нему из контейнера. В случае инъекции в синглтон, запрос происходит только при создании синглтона.

Чтобы решить эту проблему и получать новый экземпляр прототипного бина при каждом обращении, можно использовать следующие подходы:

  1. Внедрение ApplicationContext: Получать бин из контекста явно каждый раз.

    java
  2. Внедрение ObjectFactory<PrototypeBean> или Provider<PrototypeBean>: Spring предоставит прокси, который при вызове getObject() (для ObjectFactory) или get() (для Provider) будет запрашивать новый экземпляр из контекста.

    java
  3. Использование @Lookup аннотации: Создать абстрактный геттер в синглтоне, пометив его @Lookup. Spring сгенерирует подкласс синглтона, который будет переопределять этот метод для получения нового прототипного бина.

    java