Выбор ответа Junior IoC и внедрение зависимостей спрашивают часто обновлено
Бин, созданный через new
Вопрос
Разработчик создал new ReportService() вручную, а внутри поле с @Autowired осталось null и @Transactional не работает. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Объект создан не контейнером: нет ни внедрения, ни прокси. Spring обрабатывает только объекты, которые создал сам: заполняет зависимости, вызывает post-processors, создаёт прокси для транзакций.
Варианты ответа
- Нужно добавить
@Componentна класс, и поля заполнятся - Объект создан не контейнером: нет ни внедрения, ни проксиправильный ответ
- Нужно вызвать
super()в конструкторе, чтобы Spring его увидел @Autowiredработает только в классах с@Controller
Разбор
Spring обрабатывает только объекты, которые создал сам: заполняет зависимости, вызывает post-processors, создаёт прокси для транзакций. Объект из new обычный Java-объект. @Component на классе уже может стоять, но этот экземпляр всё равно не из контекста. Нужно получить бин через внедрение.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.