【问题标题】:How to run aspect advice for a method which is called by another method in the same class如何为同一类中的另一个方法调用的方法运行方面建议
【发布时间】:2012-01-06 09:36:38
【问题描述】:

我对 Spring AOP 感到很困惑。我正在尝试使用方面触发一个方法,但是将触发方面的方法也是同一个类的方法并且方面不起作用(顺便说一下没有错误)。像这样

class A extends Runnable{
  public void write(){
      System.out.println('Hi');
  }

   public void run(){
       this.write();
   }

}

<aop:after-returning  method="anyMethod" pointcut="execution(* A.write(..))"/>

任何想法将不胜感激

谢谢

【问题讨论】:

    标签: multithreading spring proxy aop pointcut


    【解决方案1】:

    在不同的线程中调用建议的方法这一事实没有任何区别。只需确保您传递给线程的实例是由 Spring 应用程序上下文创建的,而不是由您的应用程序代码创建的。

    此外,由于您建议在类中声明方法,而不是接口 - write() - 您需要执行加载时编织(并在类路径中包含 cglib)。

    【讨论】:

    • 感谢您的回答。我想,我写错了代码。请检查上面的新一个。如您所见,线程正在调用属于自己的方法。所以这意味着,在这个操作中没有与弹簧上下文的交互,因为它调用了它自己的方法。我现在该怎么做?
    • @user1072848 这不是谁调用它的问题,而是它是如何实例化的问题。
    • 那么我应该怎么做才能像你说的那样创建它?
    • 不要使用new 来实例化它。在应用程序上下文中声明您的 bean 并以编程方式从上下文中注入或检索它。 Spring 只能将建议应用于它自己创建的实例。
    • 我从 applicationContext 获得了我的实例,但它不起作用。我阅读了加载时间编织,但我认为它不应该是 Spring 的一些配置,因为这就是 Spring 的本质:简单。我真的不明白为什么它不起作用
    【解决方案2】:

    这是因为 Spring AOP 是基于代理的。您使用代理将调用委托给底层对象。但是,当底层对象的方法调用其中的另一个方法时,相同的类(您的用例)然后代理不会出现,因此您试图实现的目标是不可能的。有一些变通方法,但它们扼杀了 AOP 的目的。

    您可以在此处参考更多信息。

    http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/aop.html#aop-understanding-aop-proxies

    【讨论】:

      【解决方案3】:

      正如Abhishek Chauhan所说,Spring AOP 是基于代理的,因此无法拦截对this.someMethod() 的直接调用。但好消息是,您还可以通过 Spring manual 中所述的加载时编织在 Spring 应用程序中使用成熟的 AspectJ。这样您就可以摆脱限制甚至整个代理开销,因为 AspectJ 不需要任何代理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-17
        • 1970-01-01
        • 1970-01-01
        • 2013-10-08
        • 2013-04-20
        相关资源
        最近更新 更多