2016-09-20 11 views
1

Я работаю с 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, но речь идет о только для методов без параметра (ов)

ответ

1

Вы можете попробовать использовать Object+ вместо того, чтобы просто Object. + означает все классы, которые расширяют целевой класс. Таким образом, ваш код аспекта будет выглядеть так:

@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){ 

Я пробовал это с помощью своих образцов кода, и он отлично работает для всех типов аргументов.

+0

Спасибо !, он отлично работает. Обычно я видел это '+' в объявлении интерфейса/класса в Pointcut, никогда в параметре. –

+0

Почему бы просто не использовать '*' вместо 'Object +'? Это в основном эквивалентно, менее многословно и легче понять. Синтаксис 'MyClass + 'должен использоваться только в том случае, если у вас есть определенный базовый класс, отличный от' Object'. – kriegaex

+0

@kriegaex вы правы '' 'лучше, чем' Object + ', но я делаю некоторые исследования и могу сказать, что все это не имеет смысла для AspectJ в случае' args (entity) 'и кажется, что лучший способ - Выполнение (* com.manuel.jordan.service.impl. * ServiceImpl.saveOne (..)) && args (entity) && target (object) ' –