中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

使用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

天全县| 逊克县| 北碚区| 达拉特旗| 皮山县| 鹤庆县| 伊春市| 布尔津县| 老河口市| 玛纳斯县| 江津市| 兴海县| 滦南县| 蓝山县| 边坝县| 宜兰县| 曲阳县| 武穴市| 墨竹工卡县| 余江县| 凤阳县| 马关县| 丹寨县| 施甸县| 宜川县| 洞口县| 淮滨县| 新建县| 鸡东县| 玉屏| 江津市| 和林格尔县| 花垣县| 杭州市| 无极县| 青川县| 岳阳县| 沛县| 罗江县| 迁西县| 绥化市|