为了账号安全,请及时绑定邮箱和手机立即绑定

spring aop中的前置通知

spring aop中的前置通知

元芳怎么了 2018-09-23 20:06:38
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    <property name="beanNames">         <list>             <value>fixassetService</value><!-- 添加需要拦截的service bean-->         </list>     </property>     <property name="interceptorNames">         <list>             <value>myInterceptor</value>             <value>myInterceptor2</value>         </list>           </property></bean>在上面的配置文件中 我配置了两个interceptor ,这两个interceptor的invoke方法中的逻辑是一样的。public Object invoke(MethodInvocation invo) throws Throwable {//自己的横切逻辑 log....invo.proceed()}我想请教的问题是,在 第一个interceptor的invoke执行的时候 会执行内部的invo.proceed()方法,这个方法本质就是我们joinpoint所表示的方法(或者说被插入横切逻辑的方法),而当interceptor2执行invoke方法的 时候又会 执行interceptor2 的invoke方法,同时也就再次执行invo.proceed() 这样 不就导致 joinpoint所表示的方法执行了两次?请问 我的理解对吗
查看完整描述

1 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

并不是这样的,实际上两个代理通知之间的执行关系不是顺序关系,而是嵌套关系。
你的理解是生成代理类执行的关系是:

// 先执行myInterceptor的invoke方法myInterceptor.before();
myInterceptor.proceed();
myInterceptor.after();// 再执行myInterceptor2的invoke方法myInterceptor2.before();
myInterceptor2.invoke();
myInterceptor2.after();

这样逻辑显然是不对的
实际上执行顺序应该为:

myInterceptor.before();
myInterceptor2.before();
method.proceed(); // 执行目标方法myInterceptor2.after();
myInterceptor.after();

这是一种嵌套关系。用通俗的说法理解可以为,你先用myInterceptor代理了你目标类,生成了代理类A,再用myInterceptor2代理了代理类A,生成了代理类B。
这时候B的invoke方法就是:

myInterceptor2.before();
A.invoke();
myInterceptor2.after();

B中调用了A的invoke方法,而A的invoke方法就是:

myInterceptor.before();
method.proceed(); // 执行目标方法myInterceptor.after();

这才是实际上AOP执行的顺序,就不存在你理解的执行两次目标方法的问题。

之前我正好有写到模拟实现spring的AOP的功能,你感兴趣可以看看:
实现AOP
引入aspectj实现AOP切点
加强AOP功能


查看完整回答
反对 回复 2018-09-23
  • 1 回答
  • 0 关注
  • 980 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号