Spring 仅子类方法的 AOP 切入点表达式

Spring AOP pointcut expression for Subclass only method

我有一个场景需要拦截一些子class方法,但是我找不到合适的切入点表达式来做到这一点。

我有一个面向客户端的接口 InfoService,它有一个方法 getClientDetails

package sample;

public interface InfoService {
    InfoVO getClientDetails(int id);
}

实现 class 有一些嵌套方法,如 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 但似乎没有什么可以拦截 subclass 方法。我什至尝试使用自定义注释来注释这些信息方法,但没有成功。到目前为止,我想出了以下方面

<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 无法拦截私有 subclass 方法,但这些是 public 方法。甚至可以这样做吗?非常感谢任何帮助。

PS:显示的示例用于演示目的。实际的实现是巨大的,所以将这些内部方法移动到不同的 bean 并调用是不可行的。

这是一个经典的问题,已经在这里被问过几十次了。我猜你还没有阅读 Spring 手册中关于 Spring AOP 是基于代理的信息,因此 Spring 方面 cannot intercept self-invocation. If you really need AOP to work for self-invoked methods (even private ones if necessary), say goodbye to Spring AOP and hello to full AspectJ and LTW(加载时织入)。