Spring AOP拦截方法未生效

发布于 2022-09-11 16:11:09 字数 728 浏览 25 评论 0

问题描述

写了个切面,对方法上含有指定注解的方法进行拦截。
运行时发现,如果一个子类A继承了抽象父类B,并实现了父类的抽象方法,在子类的重写方法上加上指定注解,却发现这个方法在调用时不能被拦截。

哪位能给解释下,以及解决办法?

相关代码

// 注解
public @interface Profiling {
}
// 父类
public class B {
    public abstract void foo();
}
// 子类
public class A extent B {
    // 加上了Profiling注解,想要此方法被拦截,但实际未被拦截
    @Profiling
    @Override
    public void foo() {
        // do something
    }
}
// 定义的切面
public class Aspect {
    @Pointcut("@annotation(com.base.Profiling)")
    private void pointCut(){
    }

    @Around("pointCut()")
    public Object around(ProceedingJoinPoint pjp) {
        // do something
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

微凉 2022-09-18 16:11:09

父类重写的方法是拦截不到的,具体的你可以调试下以下这段代码。我本地没有模拟你的这种情况,但是应该也是一样的。
ReflectiveMethodInvocation.proceed(),你应该是利用AspectJ的方式来做aop拦截的,所以具体调试下AspectJExpressionPointcut.matches()方法。

不气馁 2022-09-18 16:11:09

我记得 需要 吧 Aspect 类放入 ioc 容器中吧 不然 不起作用的

而且你的注解写的也不对啊, 你需要在你写的注解上 使用 @Retention 注解. 我推荐你看看 https://segmentfault.com/a/11... 这篇文章

哽咽笑 2022-09-18 16:11:09

不清楚题主的配置文件是什么。题主可以这么去检查:
1、Aspect类需要被Spring管理,并且要被标记为@org.aspectj.lang.annotation.Aspect
2、A类需要被Spring管理。
3、@Around注解的处理逻辑应该是:

    @Around("pointCut()")
    public void around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("do something before the real invocation....");
        pjp.proceed();//真正的调用业务方法,就是foo();
        System.out.println("do something after the real invocation....");
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文