在Spring AOP中为方法编写的建议不会进入无限回调

时间:2013-12-05 06:55:03

标签: java spring aop spring-aop

我是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的执行流程和工作。

我们将非常感谢您的回复。

2 个答案:

答案 0 :(得分:3)

我建议阅读AOP chapter,特别是the section解释代理。

简而言之,春天使用代理来应用AOP,因此进入对象的方法将通过代理并将被建议。在您的方面,您正在执行getTarget,它返回实际目标(未代理对象',Circle对象的普通实例)而不是代理。

答案 1 :(得分:1)

您正在调用方法而非代理方法

((Circle)joinPoint.getTarget()).getName();

您必须在建议调用中看到第一个代理对象概念。您可以参考Spring Docs.They已经提供了有关代理对象的明确信息