springaop无法拦截service方法中调用

问题描述

springaop无法拦截service方法中调用,在service类中方法A调用带有切面注解的方法B,切面失效

问题分析

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

解决思路

	只要将方法A调用方法B过程中添加一个切面即可;

解决方法3种
1.手动获取代理对象

	1.将当前的代理类暴露给线程使用,以下2种自己选一个实现即可。
		注解实现方案:springboot:启动类上加注解:		@EnableAspectJAutoProxy(exposeProxy=true):
		配置实现方案:
	2.A中调用B:不要直接用this(因为this是目标对象,自然无法实现代理类的增强方法@before等),而是先去尝试获取代理类:UserServiceImpl service = AopContext.currentProxy() != null ? (UserService)AopContext.currentProxy() : this;

2.去除AOP切面增强,把切面方法单独封装接口方法,在需要的地方调用(我用的就是这种)
3.与方法1类似,重新获取service方法,详情参考:
https://blog.csdn.net/xfl4629712/article/details/79983959
说明

其实不一定是service类中可以这样操作,只要是接口拦截的类中出现这种问题都可以这样用哈

你可能感兴趣的:(springboot)