在service实现类中使用AopContext.currentProxy()
获取serviceImpl代理对象,通过debug查看却是方法进来的controller对象?请帮忙解决一下
在service实现类通过this获取到动态代理对象却获取到了controller
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 一码归一码@ 2023-12-05 09:33关注
在Spring中,使用AOP(面向切面编程)时,Spring会为每个被代理的bean创建一个代理对象。这个代理对象实现了与原始bean相同的接口,并且可以拦截方法调用以执行其他操作。当你在service实现类中使用this关键字获取代理对象时,你实际上获取到的是代理对象本身,而不是原始的service实现类。但是,如果你在代理对象上调用一个没有被代理的方法,它将委托给原始的service实现类。因此,如果你在代理对象上调用一个在controller中定义的方法,它将委托给controller而不是service实现类。
解决这个问题的一种方法是使用Spring AOP提供的“expose-proxy”选项。这个选项允许你在代理对象上暴露一个属性,该属性可以让你访问原始的service实现类。你可以在配置文件中设置这个选项
<aop:config proxy-target-class="true"> <aop:aspect ref="myAspect"> <aop:pointcut expression="execution(* com.example.MyService.*(..))" id="myServicePointcut"/> <aop:around pointcut-ref="myServicePointcut" method="myAdvice" expose-proxy="true"/> </aop:aspect> </aop:config>
@Service public class MyServiceImpl implements MyService { public void myMethod() { MyService proxy = (MyService) AopContext.currentProxy(); // 使用proxy.target来访问原始的service实现类 } }
解决 无用评论 打赏 举报
悬赏问题
- ¥15 #MATLAB仿真#车辆换道路径规划
- ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
- ¥15 数据可视化Python
- ¥15 要给毕业设计添加扫码登录的功能!!有偿
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥15 stable diffusion
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条