Aspectj: получение деталей @Pointcut в @Aspect - PullRequest
0 голосов
/ 12 марта 2011

У меня есть аспект, который вызывается для любого из определенных pointcut, похожий на что-то вроде этого:

@Around("pointcut1(request) || pointcut2(request) || pointcut3(request)")
public ModelAndView myAspect(ProceedingJoinPoint proceedingJp, 
                             HttpServletRequest request)
{
    //do something.
}

Итак, внутри этого аспекта мне нужно знать, для какого pointcut (pointcut1 / 2/3) этот myAspect называется. Есть ли какая-то причина, почему я могу получить это в аспекте?

Добавить подробности .....

Нет ли параметра, который я могу получить в @Aspect (метод). Я знаю, что могу получить JoinPoint, но у меня это не работает. Примерно так было бы очень удобно ....

@Around("pointcut1(request) || pointcut2(request) || pointcut3(request)")
public ModelAndView myAspect(ProceedingJoinPoint proceedingJp, PointCut pc ,HttpServletRequest request){
if (pc.equals("pointcut1")) {
    //do something.
}
if (pc.equals("pointcut2")) {
    //do something.
}
// ...

}

Пожалуйста, предложите!

Есть еще предложения, пожалуйста !!!

1 Ответ

1 голос
/ 13 марта 2011

Лучший способ сделать это - написать совет для каждой из точек соединения компонента и установить флаг, сообщающий, что он был достигнут.Из-за приоритета Аспекта (т.е. какой совет предшествует другому совету), вы должны убедиться, что рекомендация компонента лексически выше окончательной рекомендации вокруг.Это будет выглядеть так:

boolean pointcut1Reached = false;

ModelAndView around(HttpServletRequest request) : pointcut1(request) {
    pointcut1Reached = true;
    try {
         proceed(request);
    } finally {
         pointcut1Reached = false;
    }
}

// ... similar for other pointcuts

@Around("pointcut1(request) || pointcut2(request) || pointcut3(request)")
public ModelAndView myAspect(ProceedingJoinPoint proceedingJp, HttpServletRequest request){
    if (pointcut1Reached) {
        //do something.
    }
    if (pointcut2Reached) {
        //do something.
    }
    // ...
}

Здесь нужно отметить две вещи:

  1. Если ваша программа многопоточная, то вам необходимо убедиться, что экземпляр аспекта
  2. Я использую синтаксис AspectJ в стиле кода, потому что у меня есть личная предвзятость к стилю аннотации.:)

Чтобы избежать проблем с многопоточным кодом, вы можете указать модель реализации для аспекта.

aspect MyAspect percflowbelow( execution ( * * HttpServletRequest.something(..) ) { ... }

В приведенном выше утверждении говорится, что для каждого потока данных будет создан один экземпляр аспекта после вызова HttpServletRequest.something().Если один из советов достигнут внутри аспекта, но его нет в percflow ниже, то этот совет не будет выполнен.

Единственный трюк теперь состоит в том, чтобы выяснить, какой тип точки следует поместить внутриpercflowbelow.Есть ли какой-нибудь способ вызова метода в стеке, который содержит все pointcut?

Как только вы выяснили это, вам не нужно беспокоиться о многопоточности.

...