<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      spring代理和切面

      今天在deepseek上偶然問了這個問題,給出的描述很清楚,抄下來。

      攔截器鏈執(zhí)行核心

      public class ReflectiveMethodInvocation implements MethodInvocation {
          private final Object target;
          private final Method method;
          private final Object[] args;
          private final List<MethodInterceptor> interceptors;
          
          // 關(guān)鍵:當(dāng)前攔截器索引,記錄執(zhí)行位置
          private int currentInterceptorIndex = -1;
          
          public ReflectiveMethodInvocation(Object target, Method method, Object[] args, 
                                          List<MethodInterceptor> interceptors) {
              this.target = target;
              this.method = method;
              this.args = args;
              this.interceptors = interceptors;
          }
          
          @Override
          public Object proceed() throws Throwable {
              // 所有攔截器都執(zhí)行完畢,執(zhí)行原始目標(biāo)方法
              if (currentInterceptorIndex == interceptors.size() - 1) {
                  return method.invoke(target, args);
              }
              
              // 獲取下一個攔截器并執(zhí)行
              MethodInterceptor interceptor = interceptors.get(++currentInterceptorIndex);
              return interceptor.invoke(this); // 關(guān)鍵:遞歸調(diào)用鏈
          }
      }

      里面的invoke代碼不難,類似這樣:

          @Override
          public Object invoke(MethodInvocation invocation) throws Throwable {
              // 先執(zhí)行前置邏輯
              beforeAdvice.run();
              // 繼續(xù)執(zhí)行鏈
              return invocation.proceed();
          }

      所以proceed差不多可以簡化成這樣:

          @Override
          public Object proceed() throws Throwable {
              // 所有攔截器都執(zhí)行完畢,執(zhí)行原始目標(biāo)方法
              if (currentInterceptorIndex == interceptors.size() - 1) {
                  return method.invoke(target, args);
              }
              
              // 獲取下一個攔截器并執(zhí)行
              MethodInterceptor interceptor = interceptors.get(++currentInterceptorIndex);
              return proceed();
          }

      spring把controller里我們實現(xiàn)的method用一個結(jié)構(gòu)體(class)描述出來,調(diào)用的method名字,參數(shù),包括外面用aspect做的切面都塞到結(jié)構(gòu)體里。叫做ReflectiveMethodInvocation。按我的習(xí)慣就叫execution。proceed()是一個遞歸函數(shù),它總是執(zhí)行下一個切面,除非沒有切面了,再執(zhí)行真正的用戶方法。

      注意method本體的調(diào)用是在else里的,一個切面如果進(jìn)入另一個切面,它就不執(zhí)行method了。所以只有咀內(nèi)層(最末序)的切面有調(diào)用method的機會,它不是直接調(diào)用,它也是調(diào)用proceed,如果它不調(diào)用,那這個controller的方法就被繞過了。

      沒接觸spring的時候,猜測切面應(yīng)該就是鉤子吧,其實是比鉤子高級的鉤子,重要的是它把方法調(diào)用描述成數(shù)據(jù)結(jié)構(gòu),然后再“手動”調(diào)用,這樣對方法所處的執(zhí)行點位的執(zhí)行流和執(zhí)行內(nèi)容能全權(quán)控制。

      posted @ 2025-11-05 08:03  shanxin1954  閱讀(5)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 精品无套挺进少妇内谢| 国偷自产一区二区三区在线视频| 黄色A级国产免费大片视频| 最新国产精品中文字幕| 综合久青草视频在线观看| 黄色舔女人逼一区二区三区| 亚洲精品一区二区三区蜜| 中文字幕国产精品资源| 欧美性xxxxx极品少妇| 亚洲国产精品成人无码区| 拜泉县| 国产乱色熟女一二三四区| 全黄h全肉边做边吃奶视频| 欧美v国产v亚洲v日韩九九| 你拍自拍亚洲一区二区三区| 蜜臀av无码一区二区三区| 阜新| 亚洲av不卡电影在线网址最新| 国产台湾黄色av一区二区| 国产精品高清一区二区三区| 成人福利一区二区视频在线| 秋霞人妻无码中文字幕| 在线A毛片免费视频观看| 国产成人亚洲日韩欧美| 成人免费无遮挡在线播放| 国产一区二区三区AV在线无码观看| 99久9在线视频 | 传媒| 欧美福利电影A在线播放| 国产成人综合久久亚洲精品| 九九热爱视频精品| 宅男噜噜噜66在线观看| 国产SM重味一区二区三区| 高清无码18| 两个人的视频www免费| 欧美成人午夜精品免费福利| 精品国模一区二区三区| 色偷偷久久一区二区三区| 欧美高清一区三区在线专区| 荡乳尤物h| 国产精品第二页在线播放| 国产在线精品成人一区二区|