Выбор ответа Junior IoC и внедрение зависимостей спрашивают часто обновлено

Бин, созданный через new

Вопрос

Разработчик создал new ReportService() вручную, а внутри поле с @Autowired осталось null и @Transactional не работает. Почему?

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

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

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

Коротко

Правильный ответ: Объект создан не контейнером: нет ни внедрения, ни прокси. Spring обрабатывает только объекты, которые создал сам: заполняет зависимости, вызывает post-processors, создаёт прокси для транзакций.

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

  1. Нужно добавить @Component на класс, и поля заполнятся
  2. Объект создан не контейнером: нет ни внедрения, ни проксиправильный ответ
  3. Нужно вызвать super() в конструкторе, чтобы Spring его увидел
  4. @Autowired работает только в классах с @Controller

Разбор

Spring обрабатывает только объекты, которые создал сам: заполняет зависимости, вызывает post-processors, создаёт прокси для транзакций. Объект из new обычный Java-объект. @Component на классе уже может стоять, но этот экземпляр всё равно не из контекста. Нужно получить бин через внедрение.

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

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