Spring AOP:&&和和'和'

时间:2017-03-15 13:27:51

标签: spring aop aspectj

我有这个界面:

public interface Performance {
    public void perform();
}

由此类实现:

@Component
public class PerformanceImplementation implements Performance {
    public void perform() {
        System.out.println("PerformanceImplementation.perform()");
    }
}

我想将以下方面应用于上述接口的方法,但仅当该方法在另一个包中执行时,所以我使用该包名称的within指示符

@Aspect
public class Audience {

    @Pointcut("execution(** concert.Performance.perform(..)) " +
                "and within(asdasdasd.*)")
    public void performance() {}


    @Around("performance()")
    public void watchPerformance(ProceedingJoinPoint jp) {
        try {
            System.out.println("Silencing cell phones");
            System.out.println("Taking seats");
            jp.proceed();
            System.out.println("CLAP CLAP CLAP!!!");
        } catch (Throwable e) {
            System.out.println("Demanding a refund");
        } }
}

如果我使用and代替&&,则无论如何都会触发方面,而且似乎没有考虑指定者的限制。

这有什么原因吗?

1 个答案:

答案 0 :(得分:1)

这取决于您是在注释还是xml中使用它们。

切入点表达式可以使用'&&',' ||'和'!'

@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {}

组合切入点子表达式时,'&&'在XML文档中很尴尬,因此关键字'和','或'而且'不是'可用来代替'&&&#;;' ||'和'!'分别。例如,之前的切入点可能更好地写为:

<aop:pointcut id="businessService"
        expression="execution(* com.xyz.myapp.service.*.*(..)) **and** this(service)"/>