@Aspect类具有类似于切入点表达式的建议签名

时间:2018-01-24 08:08:01

标签: java spring aop aspectj spring-aop

我正在学习AOP并遇到了一个场景。

类的所有都在包com.spring Pointcut为任意类别的包@AfterReturning中的任何方法定义Advice com.spring spring.xml类型

  

Aspects定义良好,在我的类路径中,提供的代码正在运行

所以我的问题是,Pointcut类的这个建议是否应该无限运行,因为它本身满足package com.spring; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; @Aspect public class Aspects { @AfterReturning(pointcut = "execution(* com.spring.*.*(..))", returning= "res") public void logAfterExecutionAdvice(int res){ System.out.print("Result in advice: "+res); System.out.print(" In After Advice "); } } 定义?

这是 Aspect Class

package com.spring;

public class Adder {
    private int a;
    private int b;
    public int add(int a,int b){
       return (a+b);
    }
    /**
     * @return the a
     */
    public int getA() {
        return a;
    }
    /**
     * @param a the a to set
     */
    public void setA(int a) {
        this.a = a;
    }
    /**
     * @return the b
     */
    public int getB() {
        return b;
    }
    /**
     * @param b the b to set
     */
    public void setB(int b) {
        this.b = b;
    }
}

我的加法器类

package com.spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

public static void main(String[] args) {
    ApplicationContext ctx=new ClassPathXmlApplicationContext("spring.xml");
    Adder adder=(Adder)ctx.getBean("adder");
    System.out.print("Result=" + adder.add(2,3));
    }

}

我的主要类

        HttpGet post = new HttpGet(url);
        post.setHeader("User-Agent", "Android");
        HttpResponse httpResponse = httpclient.execute(post);

我得到的输出是建议结果:5在建议结果= 5之后

1 个答案:

答案 0 :(得分:1)

根据Spring的AOP文档here -

  

在Spring AOP中,不可能将方面本身作为   来自其他方面的建议目标。类上的@Aspect注释   将其标记为方面,因此将其从自动代理中排除。

从自动代理和切入点中排除了标记为@Aspect的类。

所以,如果你尝试这样的事情 -

package com.spring;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class Aspects {
    @After("execution(* com.spring.Aspects.*(..))")
    public void logAfterExecutionAdvice(){
        System.out.print("In After Advice ");
    }
}

Spring会给出类似的错误 -

Error:(12, 0) ajc: advice defined in com.spring.Aspects has not been applied [Xlint:adviceDidNotMatch]