AopContext.currentProxy() 的代理对象错误(未被更新)问题

背景:

原来在springAOP的用法中,只有代理的类才会被切入,我们在controller层调用service的方法的时候,是可以被切入的,但是如果我们在service层 A方法中,调用B方法,切点切的是B方法,那么这时候是不会切入的,解决办法就是如上所示,在A方法中使用((Service)AopContext.currentProxy()).B() 来调用B方法,这样一来,就能切入了!

原文链接:https://blog.csdn.net/qq_29860591/article/details/108728150
https://blog.csdn.net/qq_29860591/article/details/108728150

声明:未解决问题,先记录场景。

controller层:

/**
 * 
 * @author Li
 * @date 2024-03-24
 */
@RestController
@RequestMapping("/peis/student")
public class PeisStudentController extends BaseController
{
    @Autowired
    private IPeisStudentService peisStudentService;

    @Autowired
    private IPeisDeptService  peisDeptService;

    @Autowired
    private ApplicationContext applicationContext;


    /**
     * 获取部门树列表
     */
    @PreAuthorize("@ss.hasPermi('peis:student:list')")
    @GetMapping("/deptTree")
    public AjaxResult deptTree(PeisDept dept)
    {
        logger.info(AopContext.currentProxy().toString());
        //IPeisDeptService deptService = applicationContext.getBean(IPeisDeptService.class);
        return success(peisDeptService.selectDeptTreeList(dept));
    }
}

service 层的代码:

/**
 * Service业务层处理
 * @author Li
 * @date 2024-03-24
 */
@Service
public class PeisDeptServiceImpl implements IPeisDeptService 
{
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private PeisDeptMapper deptMapper;

  

    /**
     * 查询部门管理数据
     *
     * @param dept 部门信息
     * @return 部门信息集合
     */
    @Override
    public List<PeisDept> selectDeptList(PeisDept dept)
    {
        return deptMapper.selectDeptList(dept);
    }

  
    /**
     * 查询部门树结构信息
     *
     * @param dept 部门信息
     * @return 部门树信息集合
     */
    @Override
    public List<PeisTreeSelect> selectDeptTreeList(PeisDept dept)
    {
        logger.info(AopContext.currentProxy().toString());
        //List<PeisDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
        List<PeisDept> depts = ((PeisDeptServiceImpl)AopContext.currentProxy()).selectDeptList(dept);
        return buildDeptTreeSelect(depts);
    }

如上所示用到了AopContext.currentProxy() 的方式进行自己类方法的调用实现被代理。代码仿照同结构生成,导包无错误,注解都加了,debug 追踪源码发现,之前的代码在controller调用service的时候会进行动态代理类的设值,使得currentProxy这个属性(放在threadLocal),可以被刷新为service类,询问gpt得到此步骤一般为spring自动执行。如下图:

在这里插入图片描述
第二步:
在这里插入图片描述

在这里插入图片描述
但是实际发现,,
在这里插入图片描述
在这里插入图片描述
等我研究研究spring深入后再来报仇!!!!
先用这个方法解决:applicationContext.getBean(IPeisDeptService.class); 原理就是拿到代理对象嘛

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值