关于HeadLineOperationController的addHeadLine方法为什么没有被执行

来源:9-15 -2 自研框架AOP2.0的实现(下)

慕函数7469937

2020-08-19

老师您好这里不太理解因为显然这里的HeadLineOperationController经过精筛之后的sortedAspectInfoList肯定不为空,按理说是不会马上返回会执行接下来的methodProxy.invokeSuper(proxy,args)方法的,但是实际上没有执行方法这是为什么呢?

写回答

3回答

慕数据5202135

2021-05-18

我来试着回答一下。。。//img.mukewang.com/szimg/60a3c7dd095fc9fc13520766.jpg

当把AspectListExecutor这个类的精筛方法注释后,打印出来的结果为:

//img.mukewang.com/szimg/60a3c83809cfec8220480393.jpg

从这个图可以看出

headLineOperationController.addHeadLine(null, null);

这个方法会递归调用service的

headLineService.addHeadLine(new HeadLine())

因此被递归调用的这个方法也会被代理执行(原controller的addHeadLine先于service执行,从上图可看出),因此调用controller的addHeadLine方法会先进入intercept方法,随后service的addHeadLine方法也会进入intercept,因此如果把精筛方法解掉注释,当第一次controller的addHeadLine方法先进入intercept方法

时,由于去掉了

ControllerTimeCalculatorAspect

这个aspect,而最终

headLineService.addHeadLine

是通过这个aspect执行的,因此controller这个时候就不会执行

returnValue = methodProxy.invokeSuper(proxy, args);

这一步,因为最终调用的headLineService已没有了执行的机会,第二次service的addHeadLine方法进入intercept的时候由于为空所以直接return,但是第一步controller会执行完剩下的

invokeAfterReturningAdvices

而翔仔老师说的加上

if(ValidationUtil.isEmpty(sortedAspectInfoList)){
    returnValue = methodProxy.invokeSuper(proxy, args);

    return returnValue;
}
是因为当第二次service的addHeadLine方法进入intercept时虽然没有为service的addHeadLine方法增强,但是通过
//returnValue = methodProxy.invokeSuper(proxy, args);这一步使service的addHeadLine方法得到了执行,因此最终打印出来的
 22:13:13 -- INFO -- 方法开始执行了,执行的类是[com.imooc.controller.superadmin.HeadLineOperationController],执行的方法是[addHeadLine],参数是[[null, null]]
 22:13:13 -- INFO -- addHeadLine被执行啦, lineName[null],lineLink[null],lineImg[null], priority[null]
 22:13:13 -- INFO -- 方法顺利完成,执行的类是[com.imooc.controller.superadmin.HeadLineOperationController],执行的方法是[addHeadLine],参数是[[null, null]],返回值是[null]

实际是controller的addline前后增强加上service的addline方法执行结果

2
0

翔仔

2020-08-21

同学好,因为collectRoughMatchedAspectListForSpecificClass方法里

if(!aspectInfo.getPointcutLocator().accurateMatches(method)){
it.remove();
}

会发现相关的method并没有匹配切面,所以就被移除了,但是为了保证切面即便不执行,但是也不能妨碍类的方法的正常执行,所以就加了执行逻辑,这个视频里面有说呢

1
0

翔仔

2020-08-20

同学好,可以调试一下呢,sortedAspectInfoList经过处理了之后,会变为null呀

0
2
慕函数7469937
//4.粗筛符合条件的Aspect List roughtMatchedAspectList = collectRoughMatchedAspectListForSpecificClass(aspectInfoList, targetClass); 调试发现执行完这一步后roughtMatchedAspectList确实有两个AspectInfo但是到后来执行代理对象的方法时执行精筛 //精筛 collectAccurateMatchedAspectList(method); 前sortedAspectInfoList就已经为空了,这是为什么,这样的话感觉没有执行Aspect逻辑呀,但事实却执行了,好迷糊。。。
2020-08-20
共2条回复

剑指Java自研框架,决胜Spring源码

快速入门Spring核心源码+从零开发自研框架

1498 学习 · 495 问题

查看课程