Java 当被同一类的方法调用时,Spring方面不工作

Java 当被同一类的方法调用时,Spring方面不工作,java,spring,aop,aspectj,spring-aop,Java,Spring,Aop,Aspectj,Spring Aop,我定义了一个方面(在spring项目中),该方面应该在方法执行后调用 class Crap { public void blah(){ //Do Something here } public void blah_internal(){ blah(); //Do Something else here } } class MyAspect { @After("execution(* Crap.blah(..))")

我定义了一个方面(在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

这里出了什么问题?

将切入点定义与其他asterix一起使用

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

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


通过将
放入xml文件(并导入所需的AspectJ依赖项),可以切换到AspectJ。Aspectj在您描述的场景中工作。

我认为您应该使用call()而不是execution()。怎么做?修改了问题,似乎不是线程的问题。当同一类的方法调用切入点时,它似乎不会被触发。请参见此处以获取解释:autoproxy标记用于Spring AOP,正如您刚才解释的,它不适用于内部调用,因为它是基于代理的,并且对
this
方法的调用不通过代理路由。我想你需要的是