Выбор ответа Senior AOP и прокси обновлено
Внедрение по классу при JDK-прокси
Вопрос
В приложении включено spring.aop.proxy-target-class=false. OrderServiceImpl implements OrderService помечен @Transactional. Что будет при внедрении OrderServiceImpl по классу?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ошибка старта: в контексте JDK-прокси интерфейса, а не OrderServiceImpl. JDK dynamic proxy это класс вида $Proxy42 implements OrderService, к OrderServiceImpl его не привести.
Варианты ответа
- Внедрится сам OrderServiceImpl без прокси, и транзакции работать не будут
- Ошибка старта: в контексте JDK-прокси интерфейса, а не OrderServiceImplправильный ответ
- Spring автоматически переключится на CGLIB только для этой точки внедрения
- Внедрится прокси по классу, и транзакции будут работать как обычно
Разбор
JDK dynamic proxy это класс вида $Proxy42 implements OrderService, к OrderServiceImpl его не привести. Spring не найдёт бин нужного типа и упадёт с BeanNotOfRequiredTypeException или NoSuchBeanDefinitionException. Поэтому в Boot по умолчанию CGLIB, а внедрять лучше по интерфейсу. Подмены прокси на голый бин и выборочного переключения нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.