请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答 回答被采纳积分+3

3回答

慕数据5202135 2021-05-18 22:18:27

我来试着回答一下。。。https://img1.sycdn.imooc.com//szimg/60a3c7dd095fc9fc13520766.jpg

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

https://img1.sycdn.imooc.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 回复 有任何疑惑可以回复我~
翔仔 2020-08-21 00:15:54

同学好,因为collectRoughMatchedAspectListForSpecificClass方法里

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

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

1 回复 有任何疑惑可以回复我~
翔仔 2020-08-20 17:13:34

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕函数7469937 #1
    老师您好,我调试了下发现一开始sortedAspectInfoList就是空的这是为什么呀,按理说不应该为空的。。。
    回复 有任何疑惑可以回复我~ 2020-08-20 21:30:24
  • 提问者 慕函数7469937 #2
    //4.粗筛符合条件的Aspect
    List<AspectInfo> roughtMatchedAspectList = collectRoughMatchedAspectListForSpecificClass(aspectInfoList, targetClass);
    调试发现执行完这一步后roughtMatchedAspectList确实有两个AspectInfo但是到后来执行代理对象的方法时执行精筛
    //精筛
            collectAccurateMatchedAspectList(method);
    前sortedAspectInfoList就已经为空了,这是为什么,这样的话感觉没有执行Aspect逻辑呀,但事实却执行了,好迷糊。。。
    回复 有任何疑惑可以回复我~ 2020-08-20 21:36:40
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信