Spring 动态代理实现代码实例

这篇文章主要介绍了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 动态代理实现代码实例 的全部内容, 来源链接: utcz.com/z/318370.html

回到顶部