背景:
原来在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); 原理就是拿到代理对象嘛