Spring的AOP切入点表达式仅适用于Subclass方法

时间:2018-02-15 10:22:27

标签: spring spring-aop pointcut

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

我的客户端面向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并调用是不可行的。

1 个答案:

答案 0 :(得分:0)

这是一个经典的,已经被问到这几十次了。我想你还没有读过关于Spring AOP是基于代理的Spring手册的信息,因此Spring方面cannot intercept self-invocation。如果你真的需要AOP来为自我调用的方法工作(如果有必要的话,甚至是私有方法),告别Spring AOP并向你问好AspectJ and LTW(加载时编织)。