亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Spring怎么實現動態代理

發布時間:2021-04-19 17:27:54 來源:億速云 閱讀:145 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關使用Spring怎么實現動態代理,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

基于jdk實現的動態代理

package com.proxy.daili;
import com.proxy.daili.service.IModelMath;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
/**
 * 動態代理模式類
 * 第一種代理模式:Jdk動態代理
 *  注意:實現InvocationHandler這個接口
 *
 *  基于接口的
 */
public class JdkDynamicProxy implements InvocationHandler {
 //定義需要代理的接口
 protected IModelMath iModelMath;

 //將需要代理的接口作為參數傳入到動態代理設計模式類中
 public JdkDynamicProxy(IModelMath iModelMath){
  this.iModelMath = iModelMath;
 }
 /**
  * 生成代理對象
  * 使用java.lang.reflect.Proxy這個類調用newProxyInstance方法
  * 返回 動態代理類對象
  */
 public IModelMath iModelMathmethod(){
  IModelMath iModelMathProxy = (IModelMath) Proxy.newProxyInstance(iModelMath.getClass().getClassLoader(),
    iModelMath.getClass().getInterfaces(),
    this);
  return iModelMathProxy;
 }
 /**
  * 開始做代理的操作
  * Object proxy 代理對象的引用
  * Method method 當前執行的方法
  * Object[] args 當前執行方法的參數
  * 返回 與被代理對象返回的值相同
  */
 @Override
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  System.out.println("你調用的方法為:"+method.getName());
  System.out.println("你調用的方法參數有:"+ Arrays.toString(args));
  Object invoke = method.invoke(iModelMath, args);
  System.out.println("方法的返回數據:"+invoke);
  return invoke;
 }
}
package com.proxy.test;
import com.proxy.daili.service.IModelMath;
import com.proxy.daili.JdkDynamicProxy;
import com.proxy.daili.service.ModelMath;
import org.junit.Test;
public class TestJDKDynamicProxy {
 /**
  * 使用jdk方式的動態代理
  * 測試
  */
 @Test
 public void testJdkDynamicProxy(){
  //需要被代理的動態對象
  IModelMath imm = new ModelMath();
  //代理對象
  IModelMath math = new JdkDynamicProxy(imm).iModelMathmethod();
  //通過代理對象做操作
  int addition = math.addition(10, 2);
  int subtraction = math.subtraction(20, 19);
  System.out.println("實際方法的數據為:"+addition);
  System.out.println("實際方法的數據為:"+subtraction);
 }
}

基于gcLib實現的動態代理

package com.proxy.daili;
import com.proxy.daili.service.IModelMath;
import com.proxy.daili.service.ModelMath;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
 * cglib動態代理設計類
 * 前提必須要先導入 cglib 包
 * 基于 實現類的
 */
public class CglibDynamicProxy implements MethodInterceptor {
 //定義被代理的實現類(注意這 是實現類,不是接口)
 private ModelMath modelMath;

 //將被代理的對象作為參數 傳入到 cglib動態代理設計類中
 public CglibDynamicProxy(ModelMath modelMath){
  this.modelMath = modelMath;
 }
 //生成代理對象
 public ModelMath getProxyModelMath(){
  //new 一個Enhancer對象
  Enhancer enhancer = new Enhancer();
  //指定他的父類(注意這 是實現類,不是接口)
  enhancer.setSuperclass(ModelMath.class);
  //指定真正做事情的回調方法
  enhancer.setCallback(this);
  //生成代理類對象
  ModelMath o = (ModelMath) enhancer.create();
  //返回
  return o;
 }
 /**
  * 執行被代理的任何方法,都會經過這個方法
  * @param o
  * @param method
  * @param objects
  * @param methodProxy
  * @return
  * @throws Throwable
  */
 @Override
 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  System.out.println("通過gclib 動態代理調用的方法名為:"+method.getName());
  System.out.println("通過gclib 動態代理調用的方法的參數包含:"+ Arrays.toString(objects));
  Object invoke = method.invoke(modelMath, objects);
  System.out.println("通過gclib 動態代理調用的方法返回的數據:"+ invoke);
  return invoke;
 }
}
package com.proxy.test;

import com.proxy.daili.CglibDynamicProxy;
import com.proxy.daili.service.ModelMath;
import org.junit.Test;

public class TestCgLibDynamicProxy {
 /**
  * 使用gclib方式的動態代理
  * 測試
  */
 @Test
 public void testCglibDynamicProxy(){
  ModelMath modelMath = new ModelMath();
  ModelMath proxyModelMath = new CglibDynamicProxy(modelMath).getProxyModelMath();
  int subtraction = proxyModelMath.subtraction(1, 44);
  int addition = proxyModelMath.addition(10, -1);
  System.out.println("執行減法得到的正式數據為:"+subtraction);
  System.out.println("執行加法得到的正式數據為:"+addition);
 }
}

關于使用Spring怎么實現動態代理就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安阳县| 文成县| 五河县| 菏泽市| 新野县| 南宁市| 抚顺县| 正镶白旗| 建湖县| 永年县| 离岛区| 南川市| 南靖县| 当雄县| 怀仁县| 华容县| 潼关县| 土默特左旗| 怀宁县| 慈利县| 南阳市| 来安县| 固镇县| 霍林郭勒市| 禹州市| 根河市| 普洱| 博客| 尼勒克县| 沙雅县| 楚雄市| 南江县| 苍山县| 磐安县| 吉林省| 石河子市| 潼关县| 万安县| 和静县| 资溪县| 红河县|