Sobes.tech
Junior — Middle

Je možné v Springu implementovať komponentu, ktorá bude súčasne fungovať ako singleton aj ako prototyp, a ako to urobiť?

sobes.tech AI

Odpoveď od AI

U Springu su beani prema zadanoj postavci singletoni ili prototipi, ali nije moguće istovremeno deklarisati bean i kao singleton i kao prototip.

Međutim, moguće je implementirati singleton bean koji interno kreira nove instance prototipa na zahtev.

Kako to uraditi:

  1. Definisati singleton bean (po default-u).
  2. Definisati prototip bean.
  3. Uvesti u singleton bean ObjectProvider ili ApplicationContext za dobijanje novih instanci prototipa po potrebi.

Primer sa 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("Prototip primer: " + this);
    }
}

Na ovaj način, singleton bean može da kreira i koristi nove instance prototipa pri svakom pozivu.