TGViewer
Java Interview Review Java Interview Review @javasobes · 6.56K subscribers
Post #369 17.6K
​Как работает инъекция прототипа в синглтон?

Раньше мы уже рассматривали различия скоупов singleton и prototype в Spring Framework. Допустим ситуацию, когда в singleton-компонент внедряется зависимость со скоупом prototype – когда будет создан её объект?

Если просто добавить к определению бина аннотацию @Scope(SCOPE_PROTOTYPE), и использовать этот бин в синглтоне через аннотацию @Autowired – будет создан только один объект. Потому что синглтон создается только однажды, и обращение к прототипу случится тоже однажды при его создании (при внедрении зависимости).

Примитивный способ получать новый объект при каждом обращении – отказаться от @Autowired, и доставать его из контекста вручную. Для этого нужно вызывать context.getBean(MyPrototype.class).

Воспользоваться автоматическим внедрением зависимостей можно через внедрение метода (паттерн «Команда»). Автовайрится не сам объект, а производящий его метод.

Более красивый декларативный способ – правильно настроить определение бина. В аннотации @Scope кроме самого scopeName доступен второй параметр – proxyMode. По умолчанию его значение NO – прокси не создается. Но если указать INTERFACES или TARGET_CLASS, то под @Autowired будет внедряться не сам объект, а сгенерированный фреймворком прокси. И когда проксируемый бин имеет скоуп prototype, то объект внутри прокси будет пересоздаваться при каждом обращении.

Лучший способ разобраться со скоупами – прочитать официальный гайд с иллюстрациями, и поэкспериментировать на практике. Для начала попробуйте пример с изображения ниже.

#Spring
More from @javasobes
  1. Sep 17, 2022Что такое synchronized? Можно применять как модификатор метода, и как самостоятельный опер…
  2. Sep 14, 2022​Чем отличаются checked и unchecked исключения? Вопрос формулируют по-разному, суть вопрос…
  3. Sep 13, 2022Какие бывают модификаторы? 🔘 Модификаторы доступа private, protected, public (рассмотрим…
  4. Sep 8, 2022Какие существуют литералы? Литерал – последовательность символов, обозначающая значение пр…
  5. Sep 6, 2022Чем отличается final finally finalize? (2/2) finally – часть языковой конструкции try-catc…
  6. Sep 2, 2022Чем отличается final finally finalize? (1/2) Тем, что это даже синтаксически разные вещи.…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →