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

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

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

      Spring Boot學習隨筆- 實現AOP(JoinPoint、ProceedingJoinPoint、自定義注解類實現切面)

      學習視頻:【編程不良人】2021年SpringBoot最新最全教程

      第十一章、AOP

      11.1 為什么要使用AOP

      • 問題

        1. 現有業務層開發存在問題
          1. 額外功能代碼存在大量冗余
          2. 每個方法都需要書寫一遍額外功能代碼不利于項目維護
      • Spring中的AOP

        AOP:Aspect 切面 + Oriented 面向 Programmaing 面向切面編程

        Aspect(切面) = Advice(通知) + Pointcut(切入點)

        Advice 通知:業務邏輯中的一些附加操作稱之通知

        Pointcut 切入點:配置通知應用于項目中那些業務操作

      • Advice通知就是附加操作的代碼,Advice通知類型都有不同的執行策略和用途。

        @Before 在目標方法執行之前執行的通知。它不能阻止方法的執行,但可以在方法執行前添加額外的功能。
        @AfterReturning 在目標方法正常返回后執行的通知。例如,如果一個方法正常返回而沒有拋出異常,就會執行這個通知。
        @AfterThrowing 在目標方法拋出異常后執行的通知。如果一個方法拋出異常,就會執行這個通知。
        @After 在目標方法執行之后執行的通知。無論目標方法如何退出(正常返回或拋出異常),都會執行的通知。
        @Around 包圍目標方法的通知,可以在目標方法執行前后添加額外的功能,并決定是否繼續執行目標方法。
      • Pointcut 是切入點,決定了Advice加在哪個具體方法代碼上,具體使用方式:

        1.切入點直接寫在附加操作里面
        @Around(value="execution(* login(..))")
        2.通過@Pointcut注解 聲明切入點,實現復用
        @Pointcut("execution(* login(..))") // 復用切入點,解耦合
            public void myPointcut(){}
        
        @Around("myPointcut()")
        @After("myPointcut()")
        @Before("myPointcut()")
        

      11.2 AOP的實現

      • 引入依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        
      • 目前UserServiceImp存在的問題

        以log日志這種額外功能為例,這樣的重復操作存在冗余代碼和耦合

        @Service
        public class UserServiceImpl implements UserService {
            @Override
            public void save(String name) {
                System.out.println("========log========");
                System.out.println("UserServiceImpl.save");
            }
        
            @Override
            public void delete(Integer id) {
                System.out.println("========log========");
                System.out.println("UserServiceImpl.delete");
            }
        
            @Override
            public void update(String name) {
                System.out.println("========log========");
                System.out.println("UserServiceImpl.update");
            }
        
            @Override
            public String find(String name) {
                System.out.println("========log========");
                System.out.println("UserServiceImpl.find");
                return "name";
            }
        }
        
      • 我們通過一個切面配置類來解耦合

        /**
         * 自定義切面配置類
         */
        @Configuration  // 指定當前類為配置類
        @Aspect // 代表這個類是一個切面配置類
        public class MyAspectConfig {
        
            @Before("execution(* com.example.service.*.*(..))") // @Before代表在業務邏輯執行前運行 value代表切入點
            public void before() {
                System.out.println(" =====前置附加操作:log====== ");
            }
        }
        
      • 通過切入點,完成整個業務的額外功能覆蓋,運行效果

      11.3 JoinPoint 參數詳解

      JoinPoint參數可以在通知體內聲明,用于獲取有關方法執行的信息。JoinPoint參數提供了許多有用的方法,例如getSignature()可以獲取方法的簽名,getArgs()可以獲取方法的參數列表,getTarget()可以獲取目標對象等。通過JoinPoint參數,我們可以在通知中訪問和操作方法執行時的上下文信息。

      JoinPoint參數通常用于以下幾種情況:

      1. 記錄日志:獲取方法的簽名和參數列表,從而記錄方法的執行情況,包括方法名、參數值等。
      2. 異常處理:獲取方法執行時拋出的異常信息,從而進行相應的異常處理。
      3. 性能監控:獲取方法的執行時間、參數值等信息,用于性能監控和優化。
      獲取執行方法的信息
      @Before("execution(* com.example.service.*.*(..))") // 
      public void before(JoinPoint joinPoint) {
          String methodName = joinPoint.getSignature().getName();
          String className = joinPoint.getTarget().getClass().getName();
          Object[] args = joinPoint.getArgs();
          System.out.println("Before 執行方法: " + methodName + " 在類:" + className);
          System.out.println("方法參數 = " + Arrays.toString(args));
      }
      

      11.4 @Around 環繞附加操作

      使用@Around注解的方法,參數必須聲明ProceedingJoinPoint,這個參數可以控制目標方法的執行

      @Around("execution(* com.example.service.*.*(..))")
      public Object around(ProceedingJoinPoint pjp) throws Throwable {
          System.out.println("======進入環繞的前置操作======");
          System.out.println("當前執行類 = " + pjp.getSignature().getName());
          System.out.println("方法名 = " + pjp.getTarget().getClass().getSimpleName());
          //放行目標方法執行
          Object proceed = pjp.proceed(); // 目標方法繼續執行
          System.out.println(" =====進入環繞的后置操作========= ");
          return proceed;
      }
      
      • 運行效果

      11.5 自定義注解方式的切入點表達式@annotation

      通過自定義注解@annotation實現切面的好處在于可以使切面的定義更加靈活和可重用。使用自定義注解可以將切面的邏輯和配置信息封裝在注解中,使得切面的使用和配置變得更加簡單和直觀。

      • MyAdvice 自定義注解

        @Retention(RetentionPolicy.RUNTIME) // 指定運行時保留
        @Target(ElementType.METHOD) //指定修飾 方法
        public @interface MyAdvice {
        }
        
      • 放在通知里的@annotation屬性使用,代表只有被@MyAdvice修飾的方法才會被加入額外功能

        **@Around("@annotation(com.example.config.MyAdvice)")**
        public Object around(ProceedingJoinPoint pjp) throws Throwable {
        			
        }
        
      • 通過將注解加在業務邏輯上,實現給目標方法加上額外功能的目的

        UserServiceImpl	
        @Override
        @MyAdvice
        public String find(String name) {
        //        System.out.println("========log========");
            System.out.println("UserServiceImpl.find");
            return "name";
        }
        

      下一章:Spring Boot學習隨筆- 文件上傳和下載(在線打卡、附件下載、MultipartFile)

      posted @ 2023-12-19 17:09  揚眉劍出鞘  閱讀(974)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 成人区人妻精品一区二蜜臀| 亚洲av无码精品蜜桃| 日韩不卡一区二区在线观看| 在国产线视频A在线视频| 色婷婷综合久久久中文字幕| 亚洲国产成人精品区综合| 国产偷国产偷亚洲高清午夜| 亚洲欧洲自拍拍偷午夜色| 狠狠做五月深爱婷婷天天综合| 女同另类激情在线三区| 人妻少妇精品性色av蜜桃| 国产对白老熟女正在播放| 亚洲国产精品热久久一区| 国产一区二区三区黄网| 男人狂桶女人高潮嗷嗷| 苏州市| 永久免费无码av在线网站| 第一精品福利导福航| 国产日韩一区二区在线| 国产涩涩视频在线观看| 男女爽爽无遮挡午夜视频| 中文字幕乱码亚洲无线三区| 国产亚洲欧洲av综合一区二区三区 | 在线免费播放av日韩| 中文字幕国产精品日韩| 成人永久性免费在线视频| 伊人久久大香线蕉网av| 国产av中文字幕精品| 国产熟女50岁一区二区| 午夜视频免费试看| 国产无遮挡又黄又爽不要vip软件| 国产偷国产偷亚洲高清日韩| 成在线人永久免费视频播放| 亚洲人成色99999在线观看| 在线播放亚洲成人av| 欧美黑人粗暴多交高潮水最多| 亚洲综合区激情国产精品| 乌克兰丰满女人a级毛片右手影院| 欧美xxxxx高潮喷水| 韩国美女福利视频一区二区| 亚洲欧美综合中文|