当前位置:首页 > CN2资讯 > 正文内容

代理模式之Cglib代理cglib代理

1天前CN2资讯

Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。

JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的类,就可以使用CGLIB实现。

  CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception(拦截)。

 CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。

Cglib子类代理:

         1) 需要引入cglib – jar文件, 但是spring的核心包中已经包括了cglib功能,所以直接引入spring-core-3.2.5.jar即可。

         2)引入功能包后,就可以在内存中动态构建子类

         3)代理的类不能为final, 否则报错。

         4) 目标对象的方法如果为final/static, 那么就不会被拦截,即不会执行目标对象额外的业务方法。

在Spring的AOP编程中,

         如果加入容器的目标对象有实现接口,用JDK代理;

         如果目标对象没有实现接口,用Cglib代理;

package loaderman.c_cglib; import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; /** * Cglib子类代理工厂 * (对UserDao 在内存中动态构建一个子类对象) * */ public class ProxyFactory implements MethodInterceptor{ // 维护目标对象 private Object target; public ProxyFactory(Object target){ this.target = target; } // 给目标对象创建代理对象 public Object getProxyInstance(){ //1. 工具类 Enhancer en = new Enhancer(); //2. 设置父类 en.setSuperclass(target.getClass()); //3. 设置回调函数 en.setCallback(this); //4. 创建子类(代理对象) return en.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("开始事务....."); // 执行目标对象的方法 Object returnValue = method.invoke(target, args); System.out.println("提交事务....."); return returnValue; } } package loaderman.c_cglib; /** * 目标对象 * */ public class UserDao { public void save() { System.out.println("-----已经保存数据!!!------"); } } package loaderman.c_cglib; public class App { public static void main(String[] args) { // 目标对象 UserDao target = new UserDao(); // class loaderman.c_cglib.UserDao System.out.println(target.getClass()); // 代理对象 UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance(); // UserDao子类:class loaderman.c_cglib.UserDao$$EnhancerByCGLIB$$25d4aeab System.out.println(proxy.getClass()); // 执行代理对象的方法 proxy.save(); } }
    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/23947.html

    分享给朋友:

    “代理模式之Cglib代理cglib代理” 的相关文章

    深度测评:CN2VPS的最佳选择与性能表现

    CN2VPS的优势与测评背景在数字化时代,VPS(虚拟专用服务器)已成为站长、企业和开发者不可或缺的基础设施。作为中国互联网的重要组成部分,CN2VPS凭借其独特的网络架构和稳定的性能,受到广泛的关注。CN2网络(中国电信下一代承载网)以其低延迟、高带宽和稳定性著称,尤其在国际访问中表现出色,成为许...

    甲骨文云免费申请详解:轻松获取免费云服务

    甲骨文云免费申请概述 当提到云服务的时候,甲骨文云绝对是一个值得关注的选项。甲骨文云(Oracle Cloud)是一项提供强大基础设施和服务的云计算平台,尤其在数据管理、分析和应用开发方面具有突出的优势。在这个日益数字化的时代,免费试用计划让用户能够亲自体验甲骨文云的强大功能,激起了很多人的好奇和兴...

    深入了解ICMP协议及其在网络管理中的应用

    ICMP(Internet Control Message Protocol,互联网控制消息协议)是TCP/IP协议族中的一种重要网络协议。我们可以把ICMP想象成网络中的信使,它主要负责在网络中传递控制消息和错误报告。这种功能对于维护网络的正常运作至关重要,让网络管理员能够及时发现并处理问题。IC...

    低价VPS: 如何选择最合适的虚拟私人服务器

    低价VPS概述 我们常常听到VPS这个词,它代表“虚拟私人服务器”。对于那些不太了解的人,VPS实际上是一种将一台物理服务器划分为多个虚拟服务器的技术。每个VPS都有独立的操作系统和存储空间,就像你在家里拥有一个独立的小房间一样。这样一来,你就能在不需要太多资金投入的情况下,拥有一台属于自己的服务器...

    ColoCrossing:优质VPS与安全托管服务提供商解析

    在美国,ColoCrossing作为一家老牌且独立的服务器和托管服务提供商,一直以来以其优质的IT解决方案著称。这家成立多年的公司,致力于满足不同类型客户的需求,无论是面向亚太地区还是欧美市场,它都有相应的数据中心来支持各种使用场景。我个人觉得他们的服务理念是非常值得推崇的,特别是在稳定性和可靠性方...

    波测评分析及其在医疗与教育领域的重要性

    波测评的定义与重要性 波测评是一种重要的技术手段,专注于评估波动的特性和行为。我发现,这种测评方法在多个行业中都扮演了至关重要的角色,比如医疗、工业和电力等领域。以脑波测评为例,它不仅可以帮助医生了解病人的大脑状态,还能在教育领域评估学习能力。这些应用展示了波测评技术在科学与技术进步中的不可或缺性。...