我是Spring AOP的新手。让我解释一下这个问题。 我有班级圈
public class Circle {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Circle getName called");
return name;
}
}
现在我已经设置了getterAdvice()
的建议,可以从before
getName()
调用class
Circle
方法,如下面的代码所示。
@Before("allGetters()")
public void getterAdvice(JoinPoint joinPoint){
System.out.println("getter Advice is called");
((Circle)joinPoint.getTarget()).getName();
}
@Pointcut("execution(* com.example.Circle.get*(..))")
void allGetters(){}
调用getName时的输出:
getter建议被称为
圈子getName叫
圈子getName叫
现在我从Circle
调用getter方法,即getName()
。它将首先执行通知方法,然后执行getName()
方法。但我已经从建议中再次调用了getName()
。仍然没有再次执行建议而没有进入无限调用。 Spring AOP如何使用这样的调用?。对于一种方法,建议只执行一次吗?
这个问题的目的是只了解Spring 3.0中AOP的执行流程和工作。
我们将非常感谢您的回复。
答案 0 :(得分:3)
我建议阅读AOP chapter,特别是the section解释代理。
简而言之,春天使用代理来应用AOP,因此进入对象的方法将通过代理并将被建议。在您的方面,您正在执行getTarget
,它返回实际目标(未代理对象',Circle
对象的普通实例)而不是代理。
答案 1 :(得分:1)
您正在调用方法而非代理方法
((Circle)joinPoint.getTarget()).getName();
您必须在建议调用中看到第一个代理对象概念。您可以参考Spring Docs.They已经提供了有关代理对象的明确信息