Лучший способ сделать это - написать совет для каждой из точек соединения компонента и установить флаг, сообщающий, что он был достигнут.Из-за приоритета Аспекта (т.е. какой совет предшествует другому совету), вы должны убедиться, что рекомендация компонента лексически выше окончательной рекомендации вокруг.Это будет выглядеть так:
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.
}
// ...
}
Здесь нужно отметить две вещи:
- Если ваша программа многопоточная, то вам необходимо убедиться, что экземпляр аспекта
- Я использую синтаксис AspectJ в стиле кода, потому что у меня есть личная предвзятость к стилю аннотации.:)
Чтобы избежать проблем с многопоточным кодом, вы можете указать модель реализации для аспекта.
aspect MyAspect percflowbelow( execution ( * * HttpServletRequest.something(..) ) { ... }
В приведенном выше утверждении говорится, что для каждого потока данных будет создан один экземпляр аспекта после вызова HttpServletRequest.something()
.Если один из советов достигнут внутри аспекта, но его нет в percflow ниже, то этот совет не будет выполнен.
Единственный трюк теперь состоит в том, чтобы выяснить, какой тип точки следует поместить внутриpercflowbelow
.Есть ли какой-нибудь способ вызова метода в стеке, который содержит все pointcut?
Как только вы выяснили это, вам не нужно беспокоиться о многопоточности.