背景:
原来在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
{@Autowiredprivate IPeisStudentService peisStudentService;@Autowiredprivate IPeisDeptService peisDeptService;@Autowiredprivate 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());@Autowiredprivate PeisDeptMapper deptMapper;/*** 查询部门管理数据** @param dept 部门信息* @return 部门信息集合*/@Overridepublic List<PeisDept> selectDeptList(PeisDept dept){return deptMapper.selectDeptList(dept);}/*** 查询部门树结构信息** @param dept 部门信息* @return 部门树信息集合*/@Overridepublic 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); 原理就是拿到代理对象嘛