仅用于子类方法的Spring AOP切入点表达式 [英] Spring AOP pointcut expression for Subclass only method

查看:0
本文介绍了仅用于子类方法的Spring AOP切入点表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个需要截取某些子类方法的方案,但我找不到正确的切入点表达式来执行此操作。

我有一个面向客户端的接口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是基于代理的信息,因此,Spring Aspectscannot intercept self-invocation。如果您确实需要AOP来处理自调用方法(如果需要,甚至是私有方法),那么告别Spring AOP,使用FullAspectJ and LTW(加载时编织)。

这篇关于仅用于子类方法的Spring AOP切入点表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆