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.

Другие вопросы по тегам