Spring перехватывает вызовы из одного и того же класса обслуживания - PullRequest
5 голосов
/ 07 сентября 2011

У меня такой же сценарий, как упомянуто в

Вызов метода Spring @Transaction методом из того же класса, не работает?

Я имел в видуответ № 1, который я думал, будет работать для моего простого класса pojo, но это не так.В моем случае у меня нет аннотации @Transaction.Это простой класс pojo.Я хочу перехватить каждый метод adduser, а также addusers, используя spring aop, если я возьму пример в посте выше.

Возможно ли перехватить метод, вызываемый из одного и того же сервисного вызова?Я имел в виду AspectJAwareProxy, который делает трюк, но не решает проблему в целом.Я имею в виду, что я не хочу, чтобы что-то было добавлено в мою бизнес-логику.Поэтому я хочу избежать любого кодирования, кроме определения pointcut и определения совета.Возможно ли это с помощью Java и Spring AOP?Я использую CGlib для генерации прокси.Версия Spring - 3.0.5. Выпуск.

Спасибо, Ajay

1 Ответ

1 голос
/ 08 сентября 2011

Чтобы это работало, вы должны использовать время загрузки вместо проксирования.Причина в том, что Spring использует прокси для достижения функциональности AOP (например, поддержки транзакций).Оказавшись внутри экземпляра класса, любые вызовы методов для методов в этом же экземпляре будут напрямую относиться к реальному объекту экземпляра, а не к прокси-серверу, поэтому советы AOP рассматриваться не будут.Ткачество при загрузке работает по-другому.Там у вас есть внешний Java-агент, который манипулирует классами на уровне байт-кода, чтобы внедрить поддержку AOP.

Вам потребуется

1: изменить командную строку Java, используемую длявключите агент аспекта пружины

2: добавьте

<context:load-time-weaver aspectj-weaving="on" />
<tx:annotation-driven mode="aspectj" />

к вашему пружинному кофигу.

Подробнее:

AspectJ Время загрузкис Spring Transaction Manager и Maven

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-aj-ltw

...