我的应用程序中编码了几个方面。除以下内容外,其他所有功能均有效。
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。
更新
我做了一些调查,发现当send从reply下面的方法中调用该方法时,这是行不通的
send
reply
@Autowire MessageService messageService; ... messageService.reply(message);
但是,如果我调用该方法,messageService.send(message)它将可以正常工作。但是,当Reply方法在内部调用send方法时,它是否也应该调用方面?
messageService.send(message)
我不知道我做错了什么。请帮我。
假设有一个来自 SimplePojo
SimplePojo
public class SimplePojo implements Pojo { public void foo() { this.bar(); } public void bar() { ... } }
当我们调用方法时foo(),它会重新调用其中的方法bar()。即使foo()从AOP代理调用了该方法,AOP代理bar()也不会涵盖的内部调用。
foo()
bar()
AOP
因此,如果没有任何建议附加到该方法bar()上,则最终将导致不被调用
解
使用AopContext.currentProxy()要调用的方法。不幸的是,这将逻辑与AOP耦合在一起。
AopContext.currentProxy()
public void foo() { ((Pojo) AopContext.currentProxy()).bar(); }