Spring的二种动态代理

本文介绍如何使用JDK和CGLib实现动态代理,通过具体示例展示了如何为接口和普通类创建代理对象,并记录方法执行时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备工作:

1:写个IAnimal接口 [Dog、Cat实现IAnimal接口]、Student类

2:引入cglib的jar包com.springsource.net.sf.cglib-2.2.0.jar

                                         一:使用JDK类

   1:要实现动态代理机制实现InvocationHandler接口,里边加属性及构造方法【方法传入任何实现类】

   2:会覆盖方法


 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  long start = System.currentTimeMillis();
  try{
   return method.invoke(target, args);
  }finally{
   long end = System.currentTimeMillis();
   System.out.println("方法["+method.getName()+" ]执行时间"+(end-start)+"ms");
  }
 }

   3:写个ProxyFactory   里边定方法

public static Object createProxyObject(MyProxy proxy){
  Object target = proxy.getTarget();
  //Proxy类专门完成代理类的操作类,可以通过此类为一个或多个接口动态地生成
  //实现类
  //下面这句话,就是动态的生成实现类
  
  return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), proxy);
 }

==============================测试:

  IAnimal dog = (IAnimal) ProxyFactory.createProxyObject(new MyProxy(new Dog()));
  dog.play();
  System.out.println(dog.getName());

                                            二:使用CGLib类

   1:写个CGlibProxy类实现MethodInterceptor覆盖方法

@Override
 public Object intercept(Object obj, Method method, Object[] args,
   MethodProxy methodProxy) throws Throwable {
  long start = System.currentTimeMillis();
  try{
   return methodProxy.invokeSuper(obj, args);//这里不是invokeSuper的话,会出现栈溢出
  }finally{
   long end = System.currentTimeMillis();
   System.out.println("方法[" + methodProxy + "]执行时间为 : " + (end-start) + "ms.");
  }
  
 }

   2:写个ProxyFactory类   写个方法及属性

static CGLibProxy proxy = new CGLibProxy();
 public static Object createProxyObject(Object obj){
  //return Enhancer.create(obj.getClass(), proxy);//与下面是等同的
  Enhancer enhancer = new Enhancer();
  enhancer.setSuperclass(obj.getClass());
  enhancer.setCallback(proxy);
  return enhancer.create();
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值