Sobes.tech
Middle+
123
questionbank

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

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

sobes.tech AI

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

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

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

    // Получение прототипного бина из контекста
    PrototypeBean prototypeBean = applicationContext.getBean(PrototypeBean.class);
    
  2. Внедрение ObjectFactory<PrototypeBean> или Provider<PrototypeBean>: Spring предоставит прокси, который при вызове getObject() (для ObjectFactory) или get() (для Provider) будет запрашивать новый экземпляр из контекста.

    // Использование ObjectFactory для получения нового экземпляра
    @Autowired
    private ObjectFactory<PrototypeBean> prototypeBeanFactory;
    
    // ...
    
    public void someMethod() {
        PrototypeBean prototypeBean = prototypeBeanFactory.getObject();
        // ... использовать новый экземпляр prototypeBean
    }
    
  3. Использование @Lookup аннотации: Создать абстрактный геттер в синглтоне, пометив его @Lookup. Spring сгенерирует подкласс синглтона, который будет переопределять этот метод для получения нового прототипного бина.

    // Использование @Lookup
    @Lookup
    public abstract PrototypeBean getPrototypeBean();
    
    // ...
    
    public void someMethod() {
        PrototypeBean prototypeBean = getPrototypeBean();
        // ... использовать новый экземпляр prototypeBean
    }