我来试着回答一下。。。
当把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方法执行结果