Бин с областью видимости prototype, внедренный (инжектированный) в синглтон-бин, будет создан один раз при инициализации синглтона и далее использован многократно (одна и та же его копия) при каждом обращении к нему из синглтона. Spring создает прототипный бин при каждом запросе к нему из контейнера. В случае инъекции в синглтон, запрос происходит только при создании синглтона.
Чтобы решить эту проблему и получать новый экземпляр прототипного бина при каждом обращении, можно использовать следующие подходы:
Внедрение ApplicationContext: Получать бин из контекста явно каждый раз.
java
Внедрение ObjectFactory<PrototypeBean> или Provider<PrototypeBean>: Spring предоставит прокси, который при вызове getObject() (для ObjectFactory) или get() (для Provider) будет запрашивать новый экземпляр из контекста.
java
Использование @Lookup аннотации: Создать абстрактный геттер в синглтоне, пометив его @Lookup. Spring сгенерирует подкласс синглтона, который будет переопределять этот метод для получения нового прототипного бина.
java