【问题标题】:Spring AOP pointcut expression for Subclass only method仅子类方法的 Spring AOP 切入点表达式
【发布时间】: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>

&lt;aop:aspectj-autoproxy proxy-target-class="false"/&gt; 设置为 true 或 false 也无济于事。 我知道 AOP 不能拦截私有子类方法,但这些是公共方法。甚至有可能做到这一点吗?非常感谢任何帮助。

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

【问题讨论】:

    标签: spring spring-aop pointcut


    【解决方案1】:

    这是一个经典的问题,已经在这里被问过几十次了。我猜你还没有阅读 Spring 手册中关于 Spring AOP 是基于代理的信息,因此 Spring 方面 cannot intercept self-invocation。如果您确实需要 AOP 来处理自调用方法(必要时甚至是私有方法),请告别 Spring AOP 并向完整的AspectJ and LTW(加载时编织)问好。

    【讨论】:

    • 也浏览过这些帖子。那时大多数人都几岁了,所以我希望春天在这些年里可能会变魔术;)
    • 在这种情况下,他们可能会更新手册,因为这将是一个重大的(兼容性)破坏性更改。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多