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

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

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

      spring AOP總結

      一、概念

        AOP面向切面編程,一種編程范式

      二、作用

        在不改動原始設計(原代碼不改動)的基礎上為方法進行功能增強(即增加功能)

      三、核心概念

        1、代理(Proxy):SpringAOP的核心本質是采用代理模式實現的

        2、連接點(JoinPoint):在SpringAOP中,理解為任意方法的執行

        3、切入點(Pointcut):匹配連接點的式子,也是具有共性功能的方法描述

        4、通知(Advice):若干個方法的共性功能,在切入點處執行,最終體現為一個方法

        5、切面(Aspect):描述通知與切入點的對應關系

        6、目標對象(Target):被代理的原始對象成為目標對象

      四、快速開始

        1、導入相關依賴

        由于導入spring-context時會自動導入spring的AOP包所以,這里只用導入aspectjweaver即可。

        在pom.xml文件中導入

       

          <dependencies>
         <!--spring核心依賴,會將spring-aop傳遞進來--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.29</version> </dependency>
          <!--切入點表達式依賴,目的是找到切入點方法,也就是找到要增強的方法--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.19</version> </dependency> </dependencies>

       

        2、定義dao接口與實現類

        在dao下面創建BookDao接口類文件

      public interface BookDao {
          public void save();
          public void update();
      }

        在dao下面創建impl文件夾,里面創建BookDao的實現類BookDaoImpl

      package com.itheima.dao.impl;
      
      import com.itheima.dao.BookDao;
      import org.springframework.stereotype.Repository;
      
      @Repository
      public class BookDaoImpl implements BookDao {
          public void save() {
              System.out.println(System.currentTimeMillis());
              System.out.println("book dao save ...");
          }
          public void update(){
              System.out.println("book dao update ...");
          }
      }

        3、定義通知類,制作通知方法

        創建aop文件夾,并在下面創建類MyAdvice。

      package com.itheima.aop;
      
      import org.springframework.stereotype.Component;
      
      @Component
      public class MyAdvice {
          public void method() {
              System.out.println(System.currentTimeMillis());
              System.out.println("進行增強功能");
          }
      }

        4、定義切入點表達式、配置切面(綁定切入點與通知關系)

      package com.itheima.aop;

      import org.aspectj.lang.annotation.Aspect;
      import org.aspectj.lang.annotation.Before;
      import org.aspectj.lang.annotation.Pointcut;
      import org.springframework.stereotype.Component;

      @Component
      @Aspect
      public class MyAdvice {
      //設置切入點,@Pointcut注解要求配置在方法上方
      @Pointcut("execution(void com.itheima.dao.BookDao.update())")
      private void pt(){}
      //設置在切入點pt()的前面運行當前操作(前置通知)
      @Before("pt()")
      public void method() {
      System.out.println(System.currentTimeMillis());
      System.out.println("進行增強功能");
      }
      }

        5、在配置類中進行Spring注解包掃描和開啟AOP功能  

        創建config文件夾,創建Spring的配置文件。

      package com.itheima.config;
      
      import org.springframework.context.annotation.ComponentScan;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.context.annotation.EnableAspectJAutoProxy;
      
      // 告知spring這是個配置類
      @Configuration
      // 掃描指定包
      @ComponentScan(basePackages = {"com.itheima"})
      // 開啟aop,告知spring開啟使用注解的方式開啟aop
      @EnableAspectJAutoProxy
      public class SpringConfig {
      
      }

        6、創建啟動文件

        在項目目錄下創建啟動類文件,App文件

      package com.itheima;
      
      import com.itheima.config.SpringConfig;
      import com.itheima.dao.BookDao;
      import org.springframework.context.annotation.AnnotationConfigApplicationContext;
      
      public class App {
          public static void main(String[] args) {
              // 1. 創建容器對象, 傳入配置類
              AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
              // 2. 從容器中獲取對象
              BookDao bookDao = context.getBean(BookDao.class);
              // 3. 執行方法
      //        bookDao.save();
              bookDao.update();
          }
      }

        7、最終項目目錄結構

       

      五、切入點表達式

        1、切入點:要進行增強的方法

        2、切入點表達式:要進行增強的方法的描述方式

          切入點表達式標準格式:動作關鍵字(訪問修飾符   返回值   包名.類/接口名.方法名(參數)異常名)

      execution(* com.testweb.service.*Service.*(..))

        切入點表達式描述通配符

          作用:用于快速描述,范圍描述

          * :匹配任意符號(常用)

          ..:匹配多個連續的任意符號(常用)

          +:匹配子類型

        切入點表達式書寫技巧

          1、按標準規范開發

          2、查詢操作的返回值建議使用*匹配

          3、減少使用 .. 的形式描述包

          4、對接口進行描述,使用 * 表示模塊名,例如UserService的匹配描述為 *Service 

          5、方法名書寫保留動詞,例如get,使用 * 表示名詞,例如getById匹配描述為 getBy*

          6、參數根據實際情況靈活調整

       六、通知類型

        1、通知類型

          1、前置通知

          2、后置通知

          3、環繞通知(重點)

            *  環繞通知依賴形參ProceedingJoinPoint才能實現對原始方法的調用

            *  環繞通知可以隔離原始方法的調用執行

            *  環繞通知返回值設置為object類型

            *  環繞通知中可以對原始方法調用過程中出現的異常進行處理

          4、返回后通知

          5、拋出異常后通知

        2、AOP通知獲取數據

          1、獲取切入點方法的參數

            *  JoinPoint:適用于前置(@Before)、后置(@after)、返回后(@AfterReturning)、拋出異常后通知(@AfterThrowing)

      package com.itheima.aop;
      
      import org.aspectj.lang.JoinPoint;
      import org.aspectj.lang.annotation.Aspect;
      import org.aspectj.lang.annotation.Before;
      import org.aspectj.lang.annotation.Pointcut;
      import org.springframework.stereotype.Component;
      
      @Component
      @Aspect
      public class MyAdvice {
          //設置切入點,@Pointcut注解要求配置在方法上方
          @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
          private void pt(){}
          //設置在切入點pt()的前面運行當前操作(前置通知)
          @Before("pt()")
          public void method(JoinPoint jp) {
              // 獲取參數
              for (Object o : jp.getArgs()) {
                  System.out.println(o);
              }
              System.out.println(System.currentTimeMillis());
              System.out.println("進行增強功能");
          }
      }

            * ProceedJointPoint:適用于環繞通知

      package com.itheima.aop;
      
      import org.aspectj.lang.ProceedingJoinPoint;
      import org.aspectj.lang.annotation.*;
      import org.springframework.stereotype.Component;
      
      @Component
      @Aspect
      public class MyAdvice {
          //設置切入點,@Pointcut注解要求配置在方法上方
          @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
          private void pt() {
          }
      
          //設置在切入點pt()的前面運行當前操作(前置通知)
          @Around("pt()")
          public Object method(ProceedingJoinPoint pjp) throws Throwable {
              // 獲取參數
              Object[] args = pjp.getArgs();
              // 修改原先的參數
              args[0] = 666;
              // 執行原方法,并傳入參數
              Object ret = pjp.proceed(args);
              System.out.println("進行增強功能");
              return ret;
          }
      }

          2、獲取切入點方法返回值

            *  返回后通知

      package com.itheima.aop;
      
      import org.aspectj.lang.JoinPoint;
      import org.aspectj.lang.ProceedingJoinPoint;
      import org.aspectj.lang.annotation.*;
      import org.springframework.stereotype.Component;
      
      import java.util.Arrays;
      
      @Component
      @Aspect
      public class MyAdvice {
          //設置切入點,@Pointcut注解要求配置在方法上方
          @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
          private void pt() {
          }
          // 設置在原函數執行后執行當前操作(后置通知)
          // 如果有返回值,則可以寫成afterReturning(value = "pt()", returning = "ret"),使用ret接收原方法返回值
          // 如果有參數,則public void afterReturning(JoinPoint jp, Object ret),且JoinPoint jp,一定要在前面
          @AfterReturning(value = "pt()", returning = "ret")
          public void afterReturning(JoinPoint jp, Object ret) {
              // 獲取參數
              Object[] args = jp.getArgs();
              System.out.println("參數:" + Arrays.toString(args));
              System.out.println("返回值:" + ret);
              System.out.println("執行后置通知");
          }
      }

            * 環繞通知

      package com.itheima.aop;
      
      import org.aspectj.lang.ProceedingJoinPoint;
      import org.aspectj.lang.annotation.*;
      import org.springframework.stereotype.Component;
      
      @Component
      @Aspect
      public class MyAdvice {
          //設置切入點,@Pointcut注解要求配置在方法上方
          @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
          private void pt() {
          }
      
          //設置在切入點pt()的前面運行當前操作(前置通知)
          @Around("pt()")
          public Object method(ProceedingJoinPoint pjp) throws Throwable {
              // 獲取參數
              Object[] args = pjp.getArgs();
              // 修改原先的參數
              args[0] = 666;
              // 執行原方法,并傳入參數,并用ret接收原方法返回值
              Object ret = pjp.proceed(args);
              System.out.println("進行增強功能");
              return ret;
          }
      }

          3、獲取切入點方法運行異常信息

            * 拋出異常后通知

      package com.itheima.aop;
      
      import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.*;
      import org.springframework.stereotype.Component;
      
      import java.util.Arrays;
      
      @Component
      @Aspect
      public class MyAdvice {
          //設置切入點,@Pointcut注解要求配置在方法上方
          @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
          private void pt() {
          }

      @AfterThrowing(value = "pt()", throwing = "e") public void afterThrowing(JoinPoint jp, Exception e) { // 獲取參數 Object[] args = jp.getArgs(); System.out.println("參數:" + Arrays.toString(args)); System.out.println("異常:" + e); System.out.println("執行異常后置通知"); } }

            * 環繞通知

      package com.itheima.aop;
      import org.aspectj.lang.ProceedingJoinPoint;
      import org.aspectj.lang.annotation.*;
      import org.springframework.stereotype.Component;
      
      @Component
      @Aspect
      public class MyAdvice {
          //設置切入點,@Pointcut注解要求配置在方法上方
          @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
          private void pt() {
          }//設置在切入點pt()的前面運行當前操作(前置通知)
          @Around("pt()")
          public Object method(ProceedingJoinPoint pjp) {
              // 獲取參數
              Object[] args = pjp.getArgs();
              // 修改原先的參數
              args[0] = 666;
              // 執行原方法,并傳入參數
              Object ret = null;
           // 獲取異常
      try { ret = pjp.proceed(args); }catch (Throwable e) { e.printStackTrace(); } System.out.println("進行增強功能"); return ret; } }

       

      posted @ 2023-11-04 23:38  xsan  閱讀(116)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲综合精品第一页| 亚洲综合色网一区二区三区| 最新国产精品拍自在线播放| 海林市| 久久亚洲精品国产精品| 偷拍久久大胆的黄片视频| 久久国产乱子精品免费女| 国产精品午夜av福利| 亚洲激情在线一区二区三区| 亚洲免费成人av一区| 欧洲美女黑人粗性暴交视频| 水蜜桃av无码| 国产福利深夜在线播放| 成人免费ā片在线观看| 国产性生大片免费观看性| 少妇无套内谢免费视频| 墨竹工卡县| 亚洲国产日韩欧美一区二区三区| 亚洲香蕉网久久综合影视| 庄浪县| 自拍偷拍一区二区三区四| 欧美不卡无线在线一二三区观| 禹州市| 国产精品亚洲mnbav网站| 邻居少妇张开腿让我爽了一夜| 太谷县| 久久国内精品自在自线91| 久久亚洲色WWW成人男男| 成人免费乱码大片a毛片| 麻豆蜜桃av蜜臀av色欲av| 蜜桃av一区二区高潮久久精品| 亚洲高清免费在线观看| 久99久热免费视频播放| 国产高清在线A免费视频观看| 国产精品白浆在线观看免费| 熟女亚洲综合精品伊人久久| 五月婷婷久久中文字幕| 亚洲天天堂天堂激情性色| 日韩人妻无码一区二区三区99| 久久精品无码av| 亚洲国产一区二区三区久|