拦截一种方法两次

时间:2015-05-19 10:32:21

标签: java annotations aspectj

我有两个方面要进行一些验证。这些方面拦截了使用@NotNull@IsUnique注释注释的所有方法。例如:

@NotNull
@IsUnique
public void save(Player p){
    // persisting
}

方面:

public aspect NotNullInterceptor{

    pointcut NotNull(): execution(public * (@NotNull *).*(..));

    before() : NotNull() {
        //Validation and handling
    }
}

public aspect IsUniqueInterceptor{

    pointcut IsUnuque(): execution(public * (@IsUnique *).*(..));

    before() : IsUnuque() {
        //Validation and handling
    }
}

问题是我需要在NotNull验证之前严格执行IsUnique验证,以避免抛出NullPointerException

如果我在@NotNull注释之前添加@IsUnique注释,它是否可靠?

1 个答案:

答案 0 :(得分:1)

没有。切入点是一个布尔函数,用于确定方面是否适用。它不会影响方面的排序。而且,通常不可能从切入点表达式推断出这种排序。例如,考虑:

@First
@Second
@Third
void foo();

和切入点表达式:

execution(public * (@First *).*(..)) && execution(public * (@Third *).*(..));
execution(public * (@Second *).*(..));

第一个切入点应该先匹配,因为@First位于@Second之前,还是最后一位因为@Third位于@Second之后?