Sobes.tech
Back to questions
Junior — Middle
62

Возможно ли реализовать в Spring компонент, который одновременно будет вести себя как синглтон и как прототип, и как это сделать?

Companies where asked
eRaga Infosystem

Answer from AI

sobes.tech AI

В Spring по умолчанию бины бывают синглтонами или прототипами, но нельзя одновременно объявить бин и синглтоном, и прототипом.

Однако можно реализовать бин синглтон, который внутри себя создает новые экземпляры прототипа по запросу.

Как это сделать:

  1. Определить бин синглтон (по умолчанию).
  2. Определить бин прототип.
  3. В синглтон-бине внедрить ObjectProvider или ApplicationContext для получения новых экземпляров прототипа по требованию.

Пример с ObjectProvider:

@Component
@Scope("singleton")
public class SingletonBean {

    private final ObjectProvider<PrototypeBean> prototypeBeanProvider;

    public SingletonBean(ObjectProvider<PrototypeBean> prototypeBeanProvider) {
        this.prototypeBeanProvider = prototypeBeanProvider;
    }

    public void usePrototype() {
        PrototypeBean prototype = prototypeBeanProvider.getObject();
        prototype.doSomething();
    }
}

@Component
@Scope("prototype")
public class PrototypeBean {
    public void doSomething() {
        System.out.println("Prototype instance: " + this);
    }
}

Таким образом, синглтон-бин может создавать и использовать новые экземпляры прототипа при каждом вызове.