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

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

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

      Spring AOP 切面執行順序

      1. 概述

      1.1 術語

      Spring AOP 的相關術語:

      • Aspect:切面,由一系列切點、增強和引入組成的模塊對象,可定義優先級,從而影響增強和引入的執行順序。事務管理(Transaction management)在java企業應用中就是一個很好的切面樣例。
      • Join point:接入點,程序執行期的一個點,例如方法執行、類初始化、異常處理。 在Spring AOP中,接入點始終表示方法執行。
      • Advice:增強,切面在特定接入點的執行動作,包括 "around," "before" and "after"等多種類型。包含Spring在內的許多AOP框架,通常會使用攔截器來實現增強,圍繞著接入點維護著一個攔截器鏈。
      • Pointcut:切點,用來匹配特定接入點的謂詞(表達式),增強將會與切點表達式產生關聯,并運行在任何切點匹配到的接入點上。通過切點表達式匹配接入點是AOP的核心,Spring默認使用AspectJ的切點表達式。
      • Introduction:引入,為某個type聲明額外的方法和字段。Spring AOP允許你引入任何接口以及它的默認實現到被增強對象上。
      • Target object:目標對象,被一個或多個切面增強的對象。也叫作被增強對象。既然Spring AOP使用運行時代理(runtime proxies),那么目標對象就總是代理對象。
      • AOP proxy:AOP代理,為了實現切面功能一個對象會被AOP框架創建出來。在Spring框架中AOP代理的默認方式是:有接口,就使用基于接口的JDK動態代理,否則使用基于類的CGLIB動態代理。但是我們可以通過設置proxy-target-class="true",完全使用CGLIB動態代理。
      • Weaving:織入,將一個或多個切面與類或對象鏈接在一起創建一個被增強對象。織入能發生在編譯時 (compile time )(使用AspectJ編譯器),加載時(load time),或運行時(runtime) 。Spring AOP默認就是運行時織入,可以通過枚舉AdviceMode來設置。

      1.2 簡述

      本次 Spring AOP 執行順序主要是針對同一切入點的不同切面執行順序。
      Spring AOP 為定義切面的執行順序提供了兩種方案:

      • 實現 Ordered 接口
      • 使用 @Order 接口

      2. 示例

      2.1 實現 Ordered 接口

      注解類

      First

      @Documented
      @Target({ElementType.TYPE,ElementType.METHOD})
      @Retention(RUNTIME)
      public @interface First {
      }
      

      Sencod

      @Documented
      @Target({ElementType.TYPE,ElementType.METHOD})
      @Retention(RUNTIME)
      public @interface Second {
      }
      

      切面

      FirstAspect

      @Slf4j
      @Component
      @Aspect
      public class FirstAspect implements Ordered {
      
          @Pointcut("@annotation(com.booleandev.data.aop.First) || @within(com.booleandev.data.aop.First)")
          public void pointcut() {
          }
      
          @Around("pointcut()")
          public Object around(ProceedingJoinPoint pjp) {
              log.info("--------------> ann,first注解執行");
      
              try {
                  return pjp.proceed();
              } catch (Throwable throwable) {
                  throwable.printStackTrace();
                  return null;
              }
          }
      
          @Override
          public int getOrder() {
              return 1;
          }
      }
      
      

      Second

      @Slf4j
      @Component
      @Aspect
      public class SecondAspect implements Ordered{
      
          @Pointcut("@annotation(com.booleandev.data.aop.Second) || @within(com.booleandev.data.aop.Second)")
          public void pointcut() {
          }
      
          @Around("pointcut()")
          public Object around(ProceedingJoinPoint pjp) {
              log.info("--------------> ann,Second執行");
      
              try {
                  return pjp.proceed();
              } catch (Throwable throwable) {
                  throwable.printStackTrace();
                  return null;
              }
          }
      
          @Override
          public int getOrder() {
              return 2;
          }
      }
      

      切入點

      @Slf4j
      @Service
      public class UserService{
      
          @Autowired
          private UserRepository userRepository;
      
          @First
          @Second
          public List<User> findAll() {
              log.info(entityManager.toString());
              return userRepository.findAll();
          }
      }
      

      結果

      --------------> ann,first注解執行
      --------------> ann,Second執行
      

      2.2 使用 @Order 接口

      注解類

      First

      @Documented
      @Target({ElementType.TYPE,ElementType.METHOD})
      @Retention(RUNTIME)
      public @interface First {
      }
      

      Sencod

      @Documented
      @Target({ElementType.TYPE,ElementType.METHOD})
      @Retention(RUNTIME)
      public @interface Second {
      }
      

      切面

      FirstAspect

      @Slf4j
      @Component
      @Aspect
      @Order(1)
      public class FirstAspect {
      
          @Pointcut("@annotation(com.booleandev.data.aop.First) || @within(com.booleandev.data.aop.First)")
          public void pointcut() {
          }
      
          @Around("pointcut()")
          public Object around(ProceedingJoinPoint pjp) {
              log.info("--------------> ann,first注解執行");
      
              try {
                  return pjp.proceed();
              } catch (Throwable throwable) {
                  throwable.printStackTrace();
                  return null;
              }
          }
      
      }
      

      SecondAspect

      @Slf4j
      @Component
      @Aspect
      @Order(2)
      public class SecondAspect{
      
          @Pointcut("@annotation(com.booleandev.data.aop.Second) || @within(com.booleandev.data.aop.Second)")
          public void pointcut() {
          }
      
          @Around("pointcut()")
          public Object around(ProceedingJoinPoint pjp) {
              log.info("--------------> ann,Second執行");
      
              try {
                  return pjp.proceed();
              } catch (Throwable throwable) {
                  throwable.printStackTrace();
                  return null;
              }
          }
      
      }
      

      切入點

      @Slf4j
      @Service
      public class UserService{
      
          @Autowired
          private UserRepository userRepository;
      
          @First
          @Second
          public List<User> findAll() {
              log.info(entityManager.toString());
              return userRepository.findAll();
          }
      }
      

      結果

      --------------> ann,Second執行
      --------------> ann,first注解執行
      

      3. 結論

      • 切面執行順序有兩種方式
        • 實現 Ordered 接口
        • 使用 @Order注解
      • 排序為順序,數字越小,越先被執行
      • 如果同時使用了注解和實現接口,則以接口的 order 為主

      參考文檔:

      https://juejin.im/post/6844903969433583624

      https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#aop-ataspectj-advice-ordering

      posted @ 2024-07-12 10:37  booleandev  閱讀(133)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产老熟女视频一区二区| 麻豆文化传媒精品一区观看| 国产无码高清视频不卡| 青青草无码免费一二三区| 疯狂做受XXXX高潮国产| 不卡在线一区二区三区视频| 无码人妻斩一区二区三区| 久久精品国产亚洲夜色av| 色欲综合久久中文字幕网| 我要看亚洲黄色太黄一级黄| 义乌市| 国产专区精品三级免费看| 亚洲精品国产成人| 尖扎县| 亚洲人成网站999久久久综合| 熟女系列丰满熟妇AV| 国产精品国产高清国产av| 成人欧美一区二区三区在线观看| 天天躁日日躁狠狠躁中文字幕| 久久毛片少妇高潮| 天天天做夜夜夜做无码| 秋霞在线观看秋| 日本中文字幕不卡在线一区二区 | 性男女做视频观看网站| 少妇厨房愉情理9仑片视频| 国产精品爆乳奶水无码视频免费 | 三人成全免费观看电视剧高清| 性色在线视频精品| 国产不卡一区二区四区| 久久99精品久久久久久不卡| 久久三级国内外久久三级| 午夜免费无码福利视频麻豆| 果冻传媒色av国产在线播放| 日本无遮挡真人祼交视频| 亚洲精品国产第一区二区| 韩国三级+mp4| 亚洲欧洲日韩国内高清| 国产精品嫩草99av在线| 狠狠色综合播放一区二区| 少妇被黑人到高潮喷出白浆| 亚洲成年av天堂动漫网站|