cglib代理[通俗易懂]

cglib代理[通俗易懂]cglib代理​ 在此之前,我们学习了JDK动态代理,而JDK动态代理有一定的局限性,因为使用JDK动态代理时,被代理类必须实现接口,然后动态代理生成的代理类同时实现该接口实现代理模式,但在特定情况下没办法让被代理类实现接口,那么此时我们就需要使用cglib代理。代理模式的三要素两个成员:被代理对象、执行者(类似于Spring中切面的概念)使用场景:当某件事情不方便自己做,但是必须要做时…

大家好,又见面了,我是你们的朋友全栈君。

cglib代理

​ 在此之前,我们学习了JDK动态代理,而JDK动态代理有一定的局限性,因为使用JDK动态代理时,被代理类必须实现接口,然后动态代理生成的代理类同时实现该接口实现代理模式,但在特定情况下没办法让被代理类实现接口,那么此时我们就需要使用cglib代理。

代理模式的三要素

  • 两个成员:被代理对象、执行者(类似于Spring中切面的概念)
  • 使用场景:当某件事情不方便自己做,但是必须要做时使用代理模式。
  • 代理对象持有被代理对象的引用。

​ 在第一点中,执行者指的是代理对象的执行模板,例如在JDK动态代理中,实现InvocationHandler接口的类就是代理类中方法的执行模板。而在cglib代理中执行模板需要实现MethodInterceptor

使用cglib需要做的准备

JDK动态代理由于是JDK自带的,所以我们不需要在项目中引入第三方jar,但是cglib需要引入两个jar包:
在这里插入图片描述

cglib代理具体实例

创建被代理类

package _6代理模式.CGlib代理;

public class UserService  { 
   

    public void addUser(){ 
   
        System.out.println("添加用户");
    }

    public void deleteUser() { 
   
        System.out.println("删除用户");
    }

}

创建执行者

package _6代理模式.CGlib代理;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/** * 执行者 */
public class Executent implements MethodInterceptor { 
   
    /** * * @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("开启事务");
        Object result= null;
        try { 
   
            result = methodProxy.invokeSuper(o,objects);
        } catch (Throwable throwable) { 
   
            throwable.printStackTrace();
            System.out.println("回滚事务");
        }
        System.out.println("提交事务");
        return result;
    }
}

通过cglib生成代理对象

public class TestCglib { 
   
    public static void main(String[] args) { 
   
       	Enhancer enhancer = new Enhancer();
        //设置父类
        enhancer.setSuperclass(UserService.class);
        //设置执行者
        enhancer.setCallback(new Executent());
        //创建代理对象
        UserService userService = (UserService) enhancer.create();
        userService.addUser();
    }
}

执行结果:

[外链图片转存失败(img-dLKjZne6-1562928349224)(…/images/27.png)]# cglib代理

​ 在此之前,我们学习了JDK动态代理,而JDK动态代理有一定的局限性,因为使用JDK动态代理时,被代理类必须实现接口,然后动态代理生成的代理类同时实现该接口实现代理模式,但在特定情况下没办法让被代理类实现接口,那么此时我们就需要使用cglib代理。

代理模式的三要素

  • 两个成员:被代理对象、执行者(类似于Spring中切面的概念)
  • 使用场景:当某件事情不方便自己做,但是必须要做时使用代理模式。
  • 代理对象持有被代理对象的引用。

​ 在第一点中,执行者指的是代理对象的执行模板,例如在JDK动态代理中,实现InvocationHandler接口的类就是代理类中方法的执行模板。而在cglib代理中执行模板需要实现MethodInterceptor

使用cglib需要做的准备

JDK动态代理由于是JDK自带的,所以我们不需要在项目中引入第三方jar,但是cglib需要引入两个jar包:

[外链图片转存失败(img-fEj9OQOA-1562928350449)(…/images/26.png)]

cglib代理具体实例

创建被代理类

package _6代理模式.CGlib代理;

public class UserService  { 
   

    public void addUser(){ 
   
        System.out.println("添加用户");
    }

    public void deleteUser() { 
   
        System.out.println("删除用户");
    }

}

创建执行者

package _6代理模式.CGlib代理;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/** * 执行者 */
public class Executent implements MethodInterceptor { 
   
    /** * * @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("开启事务");
        Object result= null;
        try { 
   
            result = methodProxy.invokeSuper(o,objects);
        } catch (Throwable throwable) { 
   
            throwable.printStackTrace();
            System.out.println("回滚事务");
        }
        System.out.println("提交事务");
        return result;
    }
}

通过cglib生成代理对象

public class TestCglib { 
   
    public static void main(String[] args) { 
   
       	Enhancer enhancer = new Enhancer();
        //设置父类
        enhancer.setSuperclass(UserService.class);
        //设置执行者
        enhancer.setCallback(new Executent());
        //创建代理对象
        UserService userService = (UserService) enhancer.create();
        userService.addUser();
    }
}

执行结果:
cglib代理[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138916.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PriorityQueue(优先级队列总结)

    PriorityQueue(优先级队列总结)一,概念队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列 数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(PriorityQueue)二,PriorityQueue的特性Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlo.

    2022年5月1日
    52
  • 最新版本Navicat激活码【中文破解版】「建议收藏」

    (最新版本Navicat激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html76…

    2022年4月1日
    1.3K
  • 增长思维和增长黑客_黑客手册中文版

    增长思维和增长黑客_黑客手册中文版原书:《增长黑客手册——如何用数据驱动爆发式增长》点击图片可放大查看(放大后上下滑动查看)

    2025年12月13日
    1
  • import java.util.scanner是什么意思

    import java.util.scanner是什么意思java中的importjava.util.scanner;是一个类,可以用这个类来从控制台写入数据(可以是int,string等类型)例如:​importjava.util.scanner;publicclassdemo{publicstaticvoidmain(string[]wqs){stringmystr=””;system.out.print(“请你输入字符,按回车结束”);scanner

    2022年7月20日
    15
  • QT学习—使用多线程的两种方法(子类化QThread+子类化QObject)

    QT学习—使用多线程的两种方法(子类化QThread+子类化QObject)第一种方法:摘要Qt多线程方法1继承QThread1写一个继承于QThread的线程2QThread的几个函数quitexitterminate函数3正确的终止一个线程4如何正确启动一个线程41正确的启动一个全局线程和UI一直存在的线程42如何启动一个局部线程用完即释放的线程继承QThread的一些总结使用QObject实现多线的方法见:http://blog.csdn.net/czyt…

    2022年5月8日
    96
  • 通过CLR API实现C++调用C#代码交互

    通过CLR API实现C++调用C#代码交互

    2021年9月2日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号