当前位置: 首页 > 知识库问答 >
问题:

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

阎丰
2023-03-14

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

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

package sample;

public interface InfoService {
    InfoVO getClientDetails(int id);
}
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>

设置为true或false也没有帮助。我知道AOP不能拦截私有子类方法,但这些是公共的。有可能做到这一点吗?任何帮助都是非常感谢的。

PS:显示的示例是为了演示目的。实际的实现非常庞大,因此将这些内部方法转移到不同的bean并调用是不可行的。

共有1个答案

龙德海
2023-03-14

这是一个经典的问题,已经被问过几十次了。我想您还没有阅读Spring手册中关于Spring AOP是基于代理的信息,因此Spring方面不能拦截自调用。如果您真的需要AOP来为自调用方法工作(如果需要的话,甚至是私有方法),请告别Spring AOP,向full AspectJ和LTW(加载时编织)问好。

 类似资料:
  • 我正在研究一个日志方面,它需要截获所有用自定义注释注释的类和方法。 下面是可以在类和方法上注释的自定义注释类: 我使用这些切入点表达式拦截带有注释的方法和类,这适用于所有简单类,但不适用于扩展或实现的类。 但是对而不是调用通知。 当对任何类或方法应用注释时,如何编写同时拦截对任何子类方法调用的切入点表达式?

  • 我在我的Scala项目中使用带有sbt-aspectj的AeyJ库。我正在尝试使用表达式编写: 但我有以下例外: 以下AspectJ教程介绍: 因此,通过注释样式,可以仅在@pointcut表达式中使用if()切入点。if()不能包含任何正文。然后,带注释的@切入点方法必须是公共静态布尔的形式,并且可以像往常一样使用形式绑定 可以在Scala方法上使用切入点中的if()表达式吗?

  • add:如果我将方法存根添加到Fragment2中,就可以开始使用next annotation,但这是一个非常难看的解决方案 解决方案:多亏了@Kriegaex,我找到了解决方案:

  • 我在@controllerAdvice中定义了一个@ModelAttribute(键),我在多个控制器方法中使用相同的模型属性作为方法参数,因为(键)在所有控制器中都可用。 我像这样在控制器类中添加属性(key)。 我想截取所有以作为方法参数的控制器方法。 我的方面文件看起来像这样。 但是我的服务器启动失败说 [tomcat:launch]由:java引起。lang.IllegalArgument

  • 我想从类列表(可能属于不同的包)中记录所有方法的条目。注意,这些方法应该只属于指定的类。 我尝试了以下方法,但这些都不起作用 (1) 在这里使用if()切入点,我得到一个错误 (2) 使用切入点和aop的组合。xml在这里我得到一个错误 这里出了什么问题? 当然可以通过在切入点中单独指定每个类来实现,但这对于数百个类来说是不可扩展的。理想情况下,如果可以从外部文本文件中提取类列表(便于配置),那就

  • 我创建了一个带有指向带注释方法的切入点的Aspect。我作为得到的是接口中的方法声明,而不是方法实现。所以当我想获取带注释的方法参数时,我必须在接口中而不是在实现中添加注释。 如果方法注释是在方法实现中添加的,则它们没有注释。正确的切入点是什么?