Junior — Middle
Възможно ли е да реализирате в Spring компонент, който едновременно ще се държи като сингълтон и като прототип, и как да го направите?
sobes.tech AI
Отговор от AI
В Spring по подразбиране биновете са сингълтони или прототипи, но не може едновременно да се обяви бина и като сингълтон, и като прототип.
Въпреки това, може да се реализира сингълтон бина, който вътрешно създава нови екземпляри на прототип по заявка.
Как да го направите:
- Определете сингълтон бина (по подразбиране).
- Определете прототип бина.
- В сингълтон бина внедрете
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);
}
}
По този начин, сингълтон бина може да създава и използва нови екземпляри на прототипа при всяко извикване.