Выбор ответа Senior AOP и прокси обновлено

Внедрение по классу при JDK-прокси

Вопрос

В приложении включено spring.aop.proxy-target-class=false. OrderServiceImpl implements OrderService помечен @Transactional. Что будет при внедрении OrderServiceImpl по классу?

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

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

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

Коротко

Правильный ответ: Ошибка старта: в контексте JDK-прокси интерфейса, а не OrderServiceImpl. JDK dynamic proxy это класс вида $Proxy42 implements OrderService, к OrderServiceImpl его не привести.

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

  1. Внедрится сам OrderServiceImpl без прокси, и транзакции работать не будут
  2. Ошибка старта: в контексте JDK-прокси интерфейса, а не OrderServiceImplправильный ответ
  3. Spring автоматически переключится на CGLIB только для этой точки внедрения
  4. Внедрится прокси по классу, и транзакции будут работать как обычно

Разбор

JDK dynamic proxy это класс вида $Proxy42 implements OrderService, к OrderServiceImpl его не привести. Spring не найдёт бин нужного типа и упадёт с BeanNotOfRequiredTypeException или NoSuchBeanDefinitionException. Поэтому в Boot по умолчанию CGLIB, а внедрять лучше по интерфейсу. Подмены прокси на голый бин и выборочного переключения нет.

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

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

Термины по теме