yanakai 2019-11-23 22:45 采纳率: 0%
浏览 825

在service实现类通过this获取到动态代理对象却获取到了controller

在service实现类中使用AopContext.currentProxy()
获取serviceImpl代理对象,通过debug查看却是方法进来的controller对象?请帮忙解决一下

  • 写回答

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画图图形出现上下震荡的线条