我正在学习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之后
答案 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]