Sobes.tech
Junior — Middle

É possível implementar no Spring um componente que funcione tanto como um singleton quanto como um protótipo, e como fazer isso?

sobes.tech IA

Resposta da IA

No Spring, por padrão, os beans são singletons ou protótipos, mas não é possível declarar um bean como ambos ao mesmo tempo.

No entanto, é possível implementar um bean singleton que cria novas instâncias de protótipo sob demanda.

Como fazer:

  1. Definir um bean singleton (padrão).
  2. Definir um bean protótipo.
  3. Injetar no bean singleton um ObjectProvider ou ApplicationContext para obter novas instâncias do protótipo conforme necessário.

Exemplo com 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("Instância protótipo: " + this);
    }
}

Dessa forma, o bean singleton pode criar e usar novas instâncias do protótipo a cada chamada.