在AspectJ中捕获建议执行(建议建议)

时间:2016-04-13 09:15:21

标签: java aop aspectj

我试图在Maven中使用注释来捕获建议的执行,但它表示尚未应用建议。这是代码:

package testMaven8;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;


@Aspect
public class aspecter {

    public static int a;

    public void setA(int a) {
        this.a = a;
    }

    public int getA() {
        return a;
    }

    @Before("execution(*  testMaven8.das.qwe(..))")
    public void testBefore2(){
        System.out.println("yoo2");
        setA(102);
        System.out.println(a);
    }

    @Before("execution (* testMaven8.aspecter.testBefore2(..))")
    public void advice1(){
        System.out.println("advicing advice testBefore2");
    }

}

代码有问题吗?我试图避免使用Aspect类,如果可能的话。任何帮助表示赞赏。

由于

1 个答案:

答案 0 :(得分:1)

建议执行在AspectJ中是特殊的,而不是正常的方法执行。因此,如果您想捕获建议执行,您还需要一个具有令人惊讶的名称的特殊切入点 - adviceexecution(); - )

以下是一些示例代码:

驱动程序应用程序:

package de.scrum_master.app;

public class Application {
    public static void main(String[] args) {
        new Application().doSomething();
    }

    public void doSomething() {
        System.out.println("Doing something");
    }
}

方面捕获方法执行:

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class MethodInterceptor {
    @Before("execution(!static * *(..))")
    public void interceptMethod(JoinPoint thisJoinPoint) {
        System.out.println(thisJoinPoint);
    }
}

Aspect捕获建议执行:

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class AdviceInterceptor {
    @Before("!within(AdviceInterceptor) && adviceexecution()")
    public void interceptAdvice(JoinPoint thisJoinPoint) {
        System.out.println(thisJoinPoint);
    }
}

请不要尝试将建议执行拦截器打包到与另一个建议相同的方面,因为如果你不能排除adviceexecution()切入点通过!within(AdviceInterceptor)捕获自身,你可以很容易地进行无休止的递归

控制台日志:

adviceexecution(void de.scrum_master.aspect.MethodInterceptor.interceptMethod(JoinPoint))
execution(void de.scrum_master.app.Application.doSomething())
Doing something