Sobes.tech
Junior — Middle

Възможно ли е да реализирате в Spring компонент, който едновременно ще се държи като сингълтон и като прототип, и как да го направите?

sobes.tech AI

Отговор от 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("Прототипен екземпляр: " + this);
    }
}

По този начин, сингълтон бина може да създава и използва нови екземпляри на прототипа при всяко извикване.