Различная область разрешения для именованных и анонимных точечных аннотаций?

Я использую аннотации AspectJ, и по какой-то причине кажется, что область разрешения для pointcut отличается от именованного pointcut от анонимного pointcut.

Например, в приведенном ниже коде идентичный pointcut разрешается, если он анонимный, но не когда он назван. Однако именованный pointcut будет совпадать, если я использую подстановочный знак вместо определенного типа.

Какие-нибудь мысли?

import some_other_package.not_the_one_where_this_aspect_is.Account;

@Aspect
public class MyClass {


//this does not match... but matches if Account is replaced by *
@Pointcut("execution(* Account.withdraw(..)) && args(amount)")
public void withdr(double amount){}

@Before("withdr(amount)")
public void dosomething1(double amount){}


//this matches
@Before("execution(* Account.withdraw(..)) && args(amount)")
public void dosomthing2(double amount){}

}

1 ответ

Решение

В @AspectJ импорт синтаксиса бесполезен согласно документации. Вам нужно либо полностью квалифицировать имена классов, либо использовать джокеры. То, что импорт работает во втором случае, скорее отклонение от ожидаемого поведения, чем ожидалось. Вы не можете полагаться на это.

Если вы сделаете это так, оба варианта будут работать:

@Aspect
public class AccountInterceptor {
    @Pointcut("execution(* *..Account.withdraw(..)) && args(amount)")
    public void withdraw(double amount) {}

    @Before("withdraw(amount)")
    public void doSomething1(JoinPoint joinPoint, double amount) {
        System.out.println(joinPoint + " -> " + amount);
    }

    @Before("execution(* *..Account.withdraw(..)) && args(amount)")
    public void doSomething2(JoinPoint joinPoint, double amount) {
        System.out.println(joinPoint + " -> " + amount);
    }
}
Другие вопросы по тегам