Выбор ответа Senior IoC и внедрение зависимостей обновлено

ObjectProvider

Вопрос

Зачем внедрять ObjectProvider<Foo> вместо Foo?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Чтобы получить бин лениво и необязательно, через getIfAvailable(). ObjectProvider откладывает получение бина до вызова и позволяет обработать отсутствие или неоднозначность без падения контекста.

Варианты ответа

  1. Чтобы бин Foo стал потокобезопасным при параллельных вызовах
  2. Чтобы получить бин лениво и необязательно, через getIfAvailable()правильный ответ
  3. Чтобы Spring создал Foo через рефлексию без вызова конструктора
  4. Это устаревший API, который заменили на @Autowired(required = false)

Разбор

ObjectProvider откладывает получение бина до вызова и позволяет обработать отсутствие или неоднозначность без падения контекста. Для prototype-бина каждый getObject() возвращает новый экземпляр: так решают проблему prototype внутри singleton. Потокобезопасность он не добавляет. Это современный API (Spring 4.3+), а не устаревший.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.