В Spring, сколько раз создается Prototype Bean, внедренный как зависимость в Singleton Bean?

«В Spring, сколько раз создается Prototype Bean, внедренный как зависимость в Singleton Bean?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ответ: Один раз.

Причина: Singleton Bean инициализируется контейнером Spring один раз при старте контекста. Все его зависимости (включая Prototype Bean) инжектируются на этапе создания, поэтому экземпляр Prototype также создается единожды и используется повторно. Это противоречит семантике scope prototype.

Решение (как получать новый экземпляр при каждом обращении):

  1. Использование ObjectProvider<T> (рекомендуется):

    @Component
    public class SingletonBean {
        @Autowired
        private ObjectProvider<PrototypeBean> prototypeProvider;
    
        public PrototypeBean getPrototypeInstance() {
            return prototypeProvider.getObject(); // Новый экземпляр при каждом вызове
        }
    }
  2. Метод, помеченный @Lookup:
    @Component
    public abstract class SingletonBean {
        public abstract PrototypeBean getPrototypeInstance();
    }
  3. Внедрение ApplicationContext и вызов getBean(): Менее предпочтительно из-за связывания с API контейнера.