AspectJ: проблема при объединении нескольких pointcut в @Around advice
Я новичок в AspectJ, поэтому, пожалуйста, помогите мне решить проблему, возникающую в соответствии с приведенным ниже подходом.
@Aspect
public class TestAop {
@Pointcut("execution(public * com.packg.foo.ClassOne.*(..))")
public void fooPoint()
@Pointcut("execution(public * com.packg.cat.ClassTwo.*(..))")
public void catPoint()
@Pointcut("execution(public * com.packg.roo.ClassThree.*(..))")
public void rooPoint()
@Around("fooPoint() || catPoint() || rooPoint()")
public Object myAdvice(ProceedingJoinPoint joinPoint) {
//do something like joint proceed and all
}
Когда это не работает? Если я объединю все три pointcut с OR .
Когда это работает? Если я держу только два pointcuts, это работает.
Я нарушаю какие-либо правила @around совета. Можно ли иметь несколько исполнений /pointcuts?
Надеясь на ответы...
3 ответа
Я решил вышеупомянутую проблему, создав разные советы для каждого pointcut. Я только что нашел альтернативное решение, но я все еще не убежден в этом.
@Aspect
public class TestAop {
@Pointcut("execution(public * com.packg.foo.ClassOne.*(..))")
public void fooPoint()
@Pointcut("execution(public * com.packg.cat.ClassTwo.*(..))")
public void catPoint()
@Pointcut("execution(public * com.packg.roo.ClassThree.*(..))")
public void rooPoint()
@Around("fooPoint()")
public Object myFooAdvice(ProceedingJoinPoint joinPoint) {
//do something like joint proceed and all
}
@Around("catPoint()")
public Object myCatAdvice(ProceedingJoinPoint joinPoint) {
//do something like joint proceed and all
}
@Around("rooPoint()")
public Object myRooAdvice(ProceedingJoinPoint joinPoint) {
//do something like joint proceed and all
}
У меня была та же проблема, но лучшее решение IMO (работает для меня):
@Aspect
public class TestAop {
@Pointcut("execution(public * com.packg.foo.ClassOne.*(..)) || execution(public * com.packg.cat.ClassTwo.*(..)) || execution(public * com.packg.roo.ClassThree.*(..))")
public void fooPoint(){}
@Around("fooPoint()")
public Object myAdvice(ProceedingJoinPoint joinPoint) {
//do something like joint proceed and all
}
Используйте пользовательские аннотации советов, если вы хотите использовать несколько точек для одного совета.
Для справки посмотрите это видео от JavaBrains:https://youtu.be/Clz78J7SBKQ?si=nGXFpPXlia4Uzf_J.