【问题标题】:Spring Aspect not working when called by method of the same class [duplicate]由同一类的方法调用时,Spring Aspect 不起作用[重复]
【发布时间】:2014-12-24 10:22:14
【问题描述】:

我定义了一个方面(在 spring 项目中),它应该在方法执行后被调用。

class Crap {
   public void blah(){
       //Do Something here
   }

   public void blah_internal(){
       blah();
       //Do Something else here
   }
}

class MyAspect {
   @After("execution(* Crap.blah(..))")
   public void doSomething(JoinPoint joinPoint) {
      System.out.println("Coming into the aspect");
      //Some logic here
   }
}

现在如果我正常调用 Crap.blah 方法,那么方面就可以工作了

new Crap().blah(); //Prints "Coming into the aspect"

但是如果我使用其他方法调用该方法,它就不起作用

new Crap().blah_internal();   //Prints nothing

这里出了什么问题?

【问题讨论】:

标签: java spring aop aspectj spring-aop


【解决方案1】:

将切入点定义与附加的 asterix 一起使用

@After("execution(* Crap.blah*(..))")

【讨论】:

    【解决方案2】:

    你使用的是 Spring 自己的 AOP 实现吗?这是一个已知限制,在同一类中调用方法时不会应用方面。

    您可以通过将<aop:aspectj-autoproxy /> 放入您的xml 文件中来切换到AspectJ(并且显然导入所需的aspectj 依赖项)。 Aspectj 在您描述的场景中工作。

    【讨论】:

    • autoproxy 标签适用于 Spring AOP,正如您刚才解释的那样,它不适用于内部调用,因为它是基于代理的,并且对 this 方法的调用不会通过代理路由。我猜你需要的是<context:load-time-weaver/>
    猜你喜欢
    • 1970-01-01
    • 2015-05-24
    • 2021-01-28
    • 1970-01-01
    • 2013-05-29
    • 2021-12-28
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    相关资源
    最近更新 更多