关于HeadLineOperationController的addHeadLine方法为什么没有被执行
来源:9-15 -2 自研框架AOP2.0的实现(下)
![](http://img1.sycdn.imooc.com/user/533e4d00000171e602000200-100-100.jpg)
慕函数7469937
2020-08-19
老师您好这里不太理解因为显然这里的HeadLineOperationController经过精筛之后的sortedAspectInfoList肯定不为空,按理说是不会马上返回会执行接下来的methodProxy.invokeSuper(proxy,args)方法的,但是实际上没有执行方法这是为什么呢?
3回答
-
慕数据5202135
2021-05-18
我来试着回答一下。。。
当把AspectListExecutor这个类的精筛方法注释后,打印出来的结果为:
从这个图可以看出
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方法执行结果
20 -
翔仔
2020-08-21
同学好,因为collectRoughMatchedAspectListForSpecificClass方法里
if(!aspectInfo.getPointcutLocator().accurateMatches(method)){ it.remove(); }
会发现相关的method并没有匹配切面,所以就被移除了,但是为了保证切面即便不执行,但是也不能妨碍类的方法的正常执行,所以就加了执行逻辑,这个视频里面有说呢
10 -
翔仔
2020-08-20
同学好,可以调试一下呢,sortedAspectInfoList经过处理了之后,会变为null呀
022020-08-20
相似问题