spring aop无法拦截类内部的方法调用

Posted 只会一点java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring aop无法拦截类内部的方法调用相关的知识,希望对你有一定的参考价值。

1.概念

拦截器的实现原理就是动态代理,实现AOP机制。Spring 的代理实现有两种:一是基于 JDK Dynamic Proxy 技术而实现的;二是基于 CGLIB 技术而实现的。如果目标对象实现了接口,在默认情况下Spring会采用JDK的动态代理实现AOP

2.问题

在类C中,方法A调用方法B,

B方法被AOP拦截。(可能是方法B上在另外的@Aspect切面定义上了切点/也可能是加了@Transactional事务注解,底层原理也是AOP实现),最终A-》B ,B并不会触发AOP。

3.解决方案

1.手动获取代理对象

1.将当前的代理类暴露给线程使用,以下2种自己选一个实现即可。

注解实现方案:springboot:启动类上加注解:@EnableAspectJAutoProxy(exposeProxy=true):

配置实现方案:<aop:aspectj-autoproxy expose-proxy="true" />

2.A中调用B:不要直接用this(因为this是目标对象,自然无法实现代理类的增强方法@before等),而是先去尝试获取代理类:UserServiceImpl service = AopContext.currentProxy() != null ? (UserService)AopContext.currentProxy() : this;

2.去除AOP切面增强,把切面方法单独封装接口方法,在需要的地方调用

 

以上是关于spring aop无法拦截类内部的方法调用的主要内容,如果未能解决你的问题,请参考以下文章

Spring AOP不拦截从对象内部调用的方法

Spring AOP不拦截从对象内部调用的方法原因

Spring AOP不拦截从对象内部调用的方法原因

Spring AOP不拦截从对象内部调用的方法原因

Spring AOP为啥不能拦截从对象内部调用的方法

Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)