Sobes.tech
Junior — Middle

Da li je moguće implementirati u Springu komponentu koja će se istovremeno ponašati kao singleton i kao prototip, i kako to učiniti?

sobes.tech АИ

Одговор од АИ

U Spring-u, podrazumevano, beani su singleton ili prototip, 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.