From Spring documentation:
Spring AOP использует либо JDK динамические прокси или CGLIB создать прокси-сервер для данного целевого объекта. (Динамические прокси-серверы JDK предпочтительнее всякий раз, когда у вас есть выбор).
Если целевой объект для проксирования реализует хотя бы один интерфейс, тогда будет использоваться динамический прокси JDK. Все интерфейсы, реализованные целевым типом, будут проксимизованы. Если целевой объект не реализует никаких интерфейсов, тогда будет создан прокси CGLIB.
Если вы хотите принудительно использовать прокси CGLIB (например, для проксирования каждого метода, определенного для целевого объекта, а не только для тех, которые реализованы его интерфейсами), вы можете это сделать. Тем не менее, есть некоторые вопросы, которые следует учитывать:
Окончательные методы не могут быть рекомендованы, так как они не могут быть переопределены.
Вам понадобятся бинарные файлы CGLIB 2 в вашем пути к классам, тогда как динамические прокси доступны в JDK. Spring автоматически предупредит вас, когда ему понадобится CGLIB, а классы библиотеки CGLIB не найдены в пути к классам.
Конструктор вашего прокси-объекта будет вызываться дважды. Это является естественным следствием прокси-модели CGLIB, при которой подкласс создается для каждого прокси-объекта. Для каждого проксированного экземпляра создаются два объекта: фактический прокси-объект и экземпляр подкласса, который реализует совет. Это поведение не отображается при использовании прокси JDK. Обычно вызов конструктора прокси-типа дважды не является проблемой, так как обычно обычно выполняются только назначения, и в конструкторе не реализована реальная логика.
Получить код здесь:. В cglib вы можете создать прокси класса и прокси-сервер. Spring использует CGlib по умолчанию, в то время как AspectJ использует Java-прокси. Прочтите это также: http://jnb.ociweb.com/jnb/jnbNov2005.html;) –