当bean内部调用该方法时,Spring AOP无法正常工作

Far*_*ook 4 java spring spring-aop spring-boot

我在我的应用程序中编写了几个Aspects.所有其他人的工作除以下情况外.

服务接口

package com.enbiso.proj.estudo.system.service;
...
public interface MessageService {
     ...
     Message reply(Message message);
     Message send(Message message);
     ...
}
Run Code Online (Sandbox Code Playgroud)

服务实施

package com.enbiso.proj.estudo.system.service.impl;
....
@Service("messageService")
public class MessageServiceImpl implements MessageService {
   ...
   @Override
   public Message reply(Message message) {
        ...
        return this.send(message);
   }

   @Override
   public Message send(Message message) {
         ...
   }
}
Run Code Online (Sandbox Code Playgroud)

方面

@Aspect
@Component
public class NewMessageAspect {
    ...
    @AfterReturning(value = "execution(* com.enbiso.proj.estudo.system.service.impl.MessageServiceImpl.send(..))", 
                    returning = "message")
    public void perform(Message message){
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试执行该send方法时,调试点不会在方面受到影响perform.

UPDATE

我做了一些调查,发现当sendreply下面的方法调用方法时,这不起作用

@Autowire MessageService messageService;
...
messageService.reply(message);
Run Code Online (Sandbox Code Playgroud)

但是,如果我调用该方法,messageService.send(message)它工作正常.但是由于回复方法在内部调用send方法,它不应该调用方面吗?

我不知道我做错了什么.请帮我.

Far*_*ook 11

谢谢jst清理的事情.仅仅为了SO的未来开发者的信息目的,我发布了这个问题的完整答案


让我们假设有一个来自的bean SimplePojo

public class SimplePojo implements Pojo {
    public void foo() {
        this.bar();
    }
    public void bar() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当我们调用该方法时foo(),它会重新调用其中的方法bar().即使认为该方法foo()是从AOP代理调用的,AOP代理bar()也不会覆盖内部调用.

代理呼叫

因此,如果有任何附加到该方法的建议bar()未被调用,最终会产生这种情况

使用AopContext.currentProxy()要调用的方法.不幸的是,它将逻辑与AOP耦合在一起.

public void foo() {
   ((Pojo) AopContext.currentProxy()).bar();
}
Run Code Online (Sandbox Code Playgroud)

参考:

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