Как себя поведёт прототипный бин в рамках синглтона?
Ответ от нейросети
sobes.tech AI
Бин с областью видимости prototype, внедренный (инжектированный) в синглтон-бин, будет создан один раз при инициализации синглтона и далее использован многократно (одна и та же его копия) при каждом обращении к нему из синглтона. Spring создает прототипный бин при каждом запросе к нему из контейнера. В случае инъекции в синглтон, запрос происходит только при создании синглтона.
Чтобы решить эту проблему и получать новый экземпляр прототипного бина при каждом обращении, можно использовать следующие подходы:
-
Внедрение
ApplicationContext: Получать бин из контекста явно каждый раз.// Получение прототипного бина из контекста PrototypeBean prototypeBean = applicationContext.getBean(PrototypeBean.class); -
Внедрение
ObjectFactory<PrototypeBean>илиProvider<PrototypeBean>: Spring предоставит прокси, который при вызовеgetObject()(дляObjectFactory) илиget()(дляProvider) будет запрашивать новый экземпляр из контекста.// Использование ObjectFactory для получения нового экземпляра @Autowired private ObjectFactory<PrototypeBean> prototypeBeanFactory; // ... public void someMethod() { PrototypeBean prototypeBean = prototypeBeanFactory.getObject(); // ... использовать новый экземпляр prototypeBean } -
Использование
@Lookupаннотации: Создать абстрактный геттер в синглтоне, пометив его@Lookup. Spring сгенерирует подкласс синглтона, который будет переопределять этот метод для получения нового прототипного бина.// Использование @Lookup @Lookup public abstract PrototypeBean getPrototypeBean(); // ... public void someMethod() { PrototypeBean prototypeBean = getPrototypeBean(); // ... использовать новый экземпляр prototypeBean }