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):
		配置实现方案:<aop:aspectj-autoproxy expose-proxy="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类中可以这样操作,只要是接口拦截的类中出现这种问题都可以这样用哈
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值