<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功能
添加回答
举报
0/150
提交
取消
