激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - Spring中AOP概念與兩種動態代理模式原理詳解

Spring中AOP概念與兩種動態代理模式原理詳解

2022-02-27 15:04HouFei-Liu Java教程

AOP是面向切面編程的技術,AOP基于IoC基礎,是對OOP的有益補充,流行的AOP框架有Sping AOP、AspectJ,這篇文章主要給大家介紹了關于Spring中AOP概念與兩種動態代理模式原理的相關資料,需要的朋友可以參考下

1.概念

1.AOP技術簡介

AOP 為Aspect Oriented Programming 的縮寫,意思為面向切面編程,是通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。

AOP 是 OOP 的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

2.AOP的優勢

作用:在程序運行期間,在不修改源碼的情況下對方法進行功能增強優勢:減少重復代碼,提高開發效率,并且便于維護

3.Spring AOP術語

Spring 的 AOP 實現底層就是對上面的動態代理的代碼進行了封裝,封裝后我們只需要對需要關注的部分進行代碼編寫,并通過配置的方式完成指定目標的方法增強。在正式講解 AOP 的操作之前,我們必須理解 AOP 的相關術語,常用的術語如下:

Target(目標對象):代理的目標對象Proxy (代理):一個類被 AOP 織入增強后,就產生一個結果代理類Joinpoint(連接點):所謂連接點是指那些被攔截到的點。在spring中,這些點指的是方法,因為spring只支持方法類型的連接點.(可能被增強的方法)Pointcut(切入點):所謂切入點是指我們要對哪些 Joinpoint 進行攔截的定義(被增強的方法)Advice(通知/ 增強):所謂通知是指攔截到 Joinpoint 之后所要做的事情就是通知(對目標對象增強的方法)Aspect(切面):是切入點和通知(引介)的結合(目標方法+增強=切面)Weaving(織入):是指把增強應用到目標對象來創建新的代理對象的過程。 spring采用動態代理織入,而AspectJ采用編譯期織入和類裝載期織入.(一個動作,切點和通知結合的過程=織入)

4.AOP 開發明確的事項

需要編寫的內容 編寫核心業務代碼(目標類的目標方法)編寫切面類,切面類中有通知(增強功能方法)在配置文件中,配置織入關系,即將哪些通知與哪些連接點進行結合 AOP 技術實現的內容 Spring 框架監控切入點方法的執行。一旦監控到切入點方法被運行,使用代理機制,動態創建目標對象的代理對象,根據通知類別,在代理對象的對應位置,將通知對應的功能織入,完成完整的代碼邏輯運行。 AOP 底層使用哪種代理方式 在 spring 中,框架會根據目標類是否實現了接口來決定采用哪種動態代理的方式。

 

2.AOP底層實現

實際上, AOP 的底層是通過 Spring 提供的的動態代理技術實現的。在運行期間, Spring通過動態代理技術動態的生成代理對象,代理對象方法執行時進行增強功能的介入,在去調用目標對象的方法,從而完成功能的增強。

1.AOP 的動態代理技術:

常用的動態代理技術

  • JDK 代理 : 基于接口的動態代理技術
  • cglib 代理:基于父類的動態代理技術

Spring中AOP概念與兩種動態代理模式原理詳解

2.基于jdk的動態代理代碼

//---------接口1------------
package com.itspring.proxy.jdk;

public interface TargetInterface1 {
  void save();
}


//---------接口2------------
package com.itspring.proxy.jdk;

public interface TargetInterface2 {
  void update();
}


//---------接口1,接口2實現類(目標類)------------
package com.itspring.proxy.jdk;

//目標類(被增強的類)
public class Target implements TargetInterface1 ,TargetInterface2{
  public void save() {
      System.out.println("save running...");
  }

  public void update() {
      System.out.println("update running...");
  }
}


//---------通知類(方法增強類)------------
package com.itspring.proxy.jdk;

//通知類(增強類)
public class Advice {

  public void before() {
      System.out.println("前置增強...");
  }

  public void afterRunning() {
      System.out.println("后置增強...");
  }
}


//---------測試代碼------------
package com.itspring.proxy.jdk;

import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTest {

  @Test
  public void test1() {

      final Target target = new Target();

      final Advice advice = new Advice();

      //返回值就是動態生成的代理對象
      TargetInterface1 proxy1 = (TargetInterface1) Proxy.newProxyInstance(
              target.getClass().getClassLoader(),  //目標類的類加載器
              target.getClass().getInterfaces(),  //目標類實現的接口(可能有多個)
              new InvocationHandler() {
                  //調用代理對象的任何方法,實質上都是調用invoke方法
                  public Object invoke(Object proxy,  //代理對象
                                       Method method,  //目標方法對象
                                       Object[] args  //目標方法的參數
                  ) throws Throwable {
                      System.out.println("正在執行的方法:" + method.getName());
                      advice.before();  //前置增強
                      Object invoke = method.invoke(target, args);  //執行目標方法
                      advice.afterRunning();  //后置增強
                      return invoke;
                  }
              }
      );

      proxy1.save();

      //返回值就是動態生成的代理對象
      TargetInterface2 proxy2 = (TargetInterface2) Proxy.newProxyInstance(
              target.getClass().getClassLoader(),  //目標類的類加載器
              target.getClass().getInterfaces(),  //目標類實現的接口(可能有多個)
              new InvocationHandler() {
                  //調用代理對象的任何方法,實質上都是調用invoke方法
                  public Object invoke(Object proxy,  //代理對象
                                       Method method,  //目標方法對象
                                       Object[] args  //目標方法的參數
                  ) throws Throwable {
                      System.out.println("正在執行的方法:" + method.getName());
                      advice.before();
                      Object invoke = method.invoke(target, args);  //執行目標方法
                      advice.afterRunning();
                      return invoke;
                  }
              }
      );

      proxy2.update();
  }
}


Spring中AOP概念與兩種動態代理模式原理詳解

3.基于cglib的動態代理代碼

cglib是第三方的庫,spring集成了cglib.

Spring中AOP概念與兩種動態代理模式原理詳解

Spring中AOP概念與兩種動態代理模式原理詳解

//---------目標類-------------
package com.itspring.proxy.cglib;

import com.itspring.proxy.jdk.TargetInterface1;
import com.itspring.proxy.jdk.TargetInterface2;

//目標類(被增強的類)
public class Target {
  public void save() {
      System.out.println("save running...");
  }

  public void update() {
      System.out.println("update running...");
  }
}

//---------通知類(增強類)-------------
package com.itspring.proxy.cglib;

//通知類(增強類)
public class Advice {

  public void before() {
      System.out.println("前置增強...");
  }

  public void afterRunning() {
      System.out.println("后置增強...");
  }
}


//---------測試代碼-------------
package com.itspring.proxy.cglib;

import com.itspring.proxy.jdk.TargetInterface1;
import com.itspring.proxy.jdk.TargetInterface2;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTest {

  @Test
  public void test1() {
      //目標對象
      final Target target = new Target();

      //增強對象
      final Advice advice = new Advice();

      //基于cglib生成動態代理對象
      //1.創建增強器
      Enhancer enhancer = new Enhancer();
      //2.創建父類
      enhancer.setSuperclass(Target.class);
      //3.設置回調
      enhancer.setCallback(new MethodInterceptor() {
          public Object intercept(Object proxy,  //代理對象
                                  Method method,  //目標方法
                                  Object[] objects,  //目標方法的參數
                                  MethodProxy methodProxy)  //目標方法的代理
                  throws Throwable {
              //前置增強
              advice.before();
              //目標方法
              Object invoke = method.invoke(target, objects);
              //后置增強
              advice.afterRunning();
              return invoke;
          }
      });
      //4.生成代理對象
      Target target1 = (Target) enhancer.create();
      //5.測試
      target1.save();
      target1.update();

  }
}


Spring中AOP概念與兩種動態代理模式原理詳解

 

總結

到此這篇關于Spring中AOP概念與兩種動態代理模式原理的文章就介紹到這了,更多相關Spring動態代理模式原理內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_36109528/article/details/120884879

延伸 · 閱讀

精彩推薦
941
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: bt 自拍 另类 综合 欧美 | 黄色免费大片 | 红杏成人性视频免费看 | 欧美日韩精品一区二区三区蜜桃 | 综合欧美一区二区三区 | 日韩精品a在线观看 | 久久艹艹艹 | 99999久久久久久 | 九一看片.| 日韩做爰视频免费 | 最新av在线播放 | 国产激情精品一区二区三区 | 成人免费网站在线观看视频 | 草b视频在线观看 | 久色成人 | 欧美成人小视频 | mmmwww| 蜜桃免费在线 | 亚洲特黄 | 精品视频在线免费看 | 欧美日韩a∨毛片一区 | 久久经典| 欧美老外a级毛片 | 欧美黑大粗硬毛片视频 | 国产69精品久久久久久久久久 | 精品二区在线观看 | 亚洲一区久久 | 视屏一区 | 日韩黄色成人 | 91网站在线观看视频 | 久久久久亚洲视频 | 国产亚洲精品久久久久婷婷瑜伽 | 鲁丝一区二区三区不属 | 狠狠操人人干 | 亚洲情视频| 深夜福利视频绿巨人视频在线观看 | 日本不卡视频在线观看 | 黄色网址在线视频 | xfplay噜噜av| 色网免费观看 | 精品久久久久久成人av |