Sobes.tech
Junior — Middle

Είναι δυνατόν να υλοποιηθεί στο Spring ένα συστατικό που να λειτουργεί τόσο ως singleton όσο και ως πρωτότυπο, και πώς να το κάνουμε;

sobes.tech AI

Απάντηση από AI

Στο Spring, από προεπιλογή, τα beans είναι singleton ή prototype, αλλά δεν μπορεί να δηλωθεί ένα bean και ως singleton και ως prototype ταυτόχρονα.

Ωστόσο, είναι δυνατή η υλοποίηση ενός singleton bean που δημιουργεί νέα instances prototype κατόπιν αιτήματος.

Πώς το κάνουμε:

  1. Ορίστε ένα singleton bean (προεπιλογή).
  2. Ορίστε ένα prototype bean.
  3. Ενέσεις στο singleton bean ένα ObjectProvider ή ApplicationContext για να λαμβάνει νέα instances του prototype όταν χρειάζεται.

Παράδειγμα με 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);
    }
}

Έτσι, το singleton bean μπορεί να δημιουργεί και να χρησιμοποιεί νέα instances του prototype σε κάθε κλήση.