Я работаю с Spring Framework
и AspectJ
версии 1.8.9
АОП - @Pointcut синтаксис: как определить метод с суперкласса аргументом параметра/
У меня есть много классов обслуживания, давайте рассмотрим, например
- CustomerServiceImpl
- InvoiceServiceImpl
- CarServiceImpl
Дело в том, что каждый из них имеет метод saveOne
. Поэтому
- saveOne (заказчик Заказчик)
- saveOne (Счет-фактура)
- saveOne (Car автомобиль)
Если я использую следующее:
@Pointcut(value="execution(* com.manuel.jordan.service.impl.*ServiceImpl.saveOne(Car, ..)) && args(entity) && target(object)")
public void saveOnePointcut(Car entity, Object object){}
@Before(value="ServicePointcut.saveOnePointcut(entity, object)")
public void beforeAdviceSaveOne(Car entity, Object object){
Он работает. Пока здесь для лучшего понимания:
- Первый параметр представляет собой объект (
Car
в данном случае) не сохраняются - Второй параметр представляет собой объект или цель (XServiceImpl) был «перехвачен»
Примечание: Мне нужен первый параметр для аудита и ведения журнала. Поэтому он является обязательным.
Чтобы избежать подробных и создавать больше для каждого объекта, я хочу использовать тип «суперкласс». Я попытался с
@Pointcut(value="execution(* com.manuel.jordan.service.impl.*ServiceImpl.saveOne(Object, ..)) && args(entity) && target(object)")
public void saveOnePointcut(Object entity, Object object){}
@Before(value="ServicePointcut.saveOnePointcut(entity, object)")
public void beforeAdviceSaveOne(Object entity, Object object){
Обратите внимание на первый параметр в настоящее время является Object
И это не работает.
Если возможно выполнить это требование, то какой правильный синтаксис?
Я прочитал Clarification around Spring-AOP pointcuts and inheritance, но речь идет о только для методов без параметра (ов)
Спасибо !, он отлично работает. Обычно я видел это '+' в объявлении интерфейса/класса в Pointcut, никогда в параметре. –
Почему бы просто не использовать '*' вместо 'Object +'? Это в основном эквивалентно, менее многословно и легче понять. Синтаксис 'MyClass + 'должен использоваться только в том случае, если у вас есть определенный базовый класс, отличный от' Object'. – kriegaex
@kriegaex вы правы '' 'лучше, чем' Object + ', но я делаю некоторые исследования и могу сказать, что все это не имеет смысла для AspectJ в случае' args (entity) 'и кажется, что лучший способ - Выполнение (* com.manuel.jordan.service.impl. * ServiceImpl.saveOne (..)) && args (entity) && target (object) ' –