【发布时间】:2018-02-15 10:22:27
【问题描述】:
我有一个场景,我需要拦截一些子类方法,但我找不到合适的切入点表达式来这样做。
我有一个面向客户端的接口InfoService,它有一个方法getClientDetails。
package sample;
public interface InfoService {
InfoVO getClientDetails(int id);
}
实现类有一些嵌套方法,如get*Info()。
package sample;
public class InfoServiceImpl implements InfoService{
public InfoVO getClientDetails(int id) {
InfoVO clientInfo = new InfoVO();
clientInfo.setA(getAInfo(id));
clientInfo.setB(getBInfo(id));
clientInfo.setC(getCInfo(id));
return clientInfo;
}
public Object getAInfo(int id) {
return null;
}
public Object getBInfo(int id) {
return null;
}
public Object getCInfo(int id) {
return null;
}
}
当用户调用getClientDetails 方法时,我想拦截get*Info() 方法。我可以轻松拦截getClientDetails,但似乎没有任何东西可以拦截子类方法。我什至尝试使用自定义注释来注释这些信息方法,但没有运气。到目前为止,我想出了以下方面
<aop:aspect ref="infoAspect">
<aop:pointcut expression="execution(* sample.InfoService+.*Info(..))"
id="infoMethods" />
<aop:around method="aroundAdviceForinfoMethods" pointcut-ref="infoMethods" />
</aop:aspect>
将<aop:aspectj-autoproxy proxy-target-class="false"/> 设置为 true 或 false 也无济于事。
我知道 AOP 不能拦截私有子类方法,但这些是公共方法。甚至有可能做到这一点吗?非常感谢任何帮助。
PS:所示示例用于演示目的。实际的实现是巨大的,因此将这些内部方法移动到不同的 bean 并调用是不可行的。
【问题讨论】:
标签: spring spring-aop pointcut