猿问

spring aop中的前置通知

<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所表示的方法执行了两次?

请问 我的理解对吗


元芳怎么了
浏览 1004回答 1
1回答

九州编程

并不是这样的,实际上两个代理通知之间的执行关系不是顺序关系,而是嵌套关系。你的理解是生成代理类执行的关系是://&nbsp;先执行myInterceptor的invoke方法myInterceptor.before(); myInterceptor.proceed(); myInterceptor.after();//&nbsp;再执行myInterceptor2的invoke方法myInterceptor2.before(); myInterceptor2.invoke(); myInterceptor2.after();这样逻辑显然是不对的实际上执行顺序应该为:myInterceptor.before(); myInterceptor2.before(); method.proceed();&nbsp;//&nbsp;执行目标方法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();&nbsp;//&nbsp;执行目标方法myInterceptor.after();这才是实际上AOP执行的顺序,就不存在你理解的执行两次目标方法的问题。之前我正好有写到模拟实现spring的AOP的功能,你感兴趣可以看看:实现AOP引入aspectj实现AOP切点加强AOP功能
随时随地看视频慕课网APP

相关分类

Java
我要回答