一尘不染

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

spring

我的应用程序中编码了几个方面。除以下内容外,其他所有功能均有效。

Service Interface

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

Service Implementation

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) {
         ...
   }
}

Aspect

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

当我尝试执行该send方法时,调试点在方面没有受到影响perform。

更新

我做了一些调查,发现当sendreply下面的方法中调用该方法时,这是行不通的

@Autowire MessageService messageService;
...
messageService.reply(message);

但是,如果我调用该方法,messageService.send(message)它将可以正常工作。但是,当Reply方法在内部调用send方法时,它是否也应该调用方面?

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


阅读 563

收藏
2020-04-15

共1个答案

一尘不染

假设有一个来自 SimplePojo

public class SimplePojo implements Pojo {
    public void foo() {
        this.bar();
    }
    public void bar() {
        ...
    }
}

当我们调用方法时foo(),它会重新调用其中的方法bar()。即使foo()AOP代理调用了该方法,AOP代理bar()也不会涵盖的内部调用。

因此,如果没有任何建议附加到该方法bar()上,则最终将导致不被调用

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

public void foo() {
   ((Pojo) AopContext.currentProxy()).bar();
}
2020-04-15