JDK动态代理和Cglib动态代理

JDK动态代理和CGLIB动态代理 在SpringAOP中基于动态代理实现功能的增强,也就是动态的生成代理类,在代理类中织入增强的逻辑然后调用目标对象的方法。动态代理中用的比较多的两种:JDK动态代理、CGLIB动态代理。 JDK动态代理 使用JDK的java.lang.reflect.Proxy类的newProxyInstance方法实现的代理。 用一个测试接口看下具体实现: public interface JdkProxyDemoService { void queryTrs(); } @Service public 阅读详情

JDK动态代理和Cglib动态代理

动态代理

底层实现原理:动态代理是使用动态生成字节码技术生成了字节码。、

何时使用JDK还是Cglib?

1)如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP。

2)如果目标对象实现了接口,可以强制使用CGLIB实现AOP。

3)如果目标对象没有实现了接口,必须采用CGLIB库,Spring会自动在JDK动态代理和CGLIB之间转换。

JDK动态代理实现原理

利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,

在调用具体方法前调用InvokeHandler来处理。

Cglib动态代理实现原理

利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。


实例

编写实体方法Doctor

public class Doctor {
    public void save(){
        System.out.println("救人。。。");
    }
}

编写方法接口

public interface DoctorService {
    void save();
}

编写接口方法的实现类

public class DoctorServiceImpl implements DoctorService {
    @Override
    public void save() {
        Doctor doctor = new Doctor();
        doctor.save();
    }
}

Jdk动态代理

public class DocJDKProxyTest {

    @Test
    public void test(){
        final DoctorService doctorService = new DoctorServiceImpl();
        doctorService.save();

        System.out.println("-----------------------------------");
        //获取目标对象的类加载器
        ClassLoader classLoader = doctorService.getClass().getClassLoader();
        //获取目标对象实现的接口
        Class<?>[] interfaces =  doctorService.getClass().getInterfaces();
        //使用JDK动态代理类proxy定义增强规则,返回代理对象
        DoctorService proxy = (DoctorService) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("救人计划。。。");
                Object invoke = method.invoke(doctorService,args);
                System.out.println("收拾东西。。。");
                return invoke;
            }
        });
        proxy.save();
    }

}

Cglib动态代理方法

public class DocCglibTest {
    @Test
    public void test() {
        final DoctorService doctorService = new DoctorServiceImpl();
        //构建代理对象
        Enhancer enhancer = new Enhancer();
        //传递一个超类
        enhancer.setSuperclass(doctorService.getClass());
        //设置回调
        enhancer.setCallback(new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                System.out.println("救人计划。。。");
                Object invoke = method.invoke(doctorService,objects);
                System.out.println("收拾东西。。。");
                return invoke;
            }
        });
        //创建代理对象
        DoctorService proxy = (DoctorService) enhancer.create();
        proxy.save();
    }

}

测试结果

救人计划。。。
救人。。。
收拾东西。。。

区别

  • Jdk动态代理一定要有接口才能实现

  • Cglib动态代理有接口能实现, 没有接口也能实现

  • Jdk动态代理, 代理类和目标类是兄弟关系

  • Cglib动态代理, 代理类和目标类是父子关系


AOP和OOP

  • AOP: aspect oriented program, 面向切面编程

  • OOP: object oriented program, 面向对象编程

AOP通过提供了另一种编程结构的思考方式来完善OOP, OOP中的核心单元是类, 而AOP中的核心单元是切面, 切面可以将内容模块化, 例如事务管理

OOP无法对代码块中的业务进行增强, 所以我们要引入AOP, 只是为我们OOP进行补充

这就是AOP的核心思想——代理模式

就比如上题中的

救人是医生的核心业务,是需要医生自己处理的,是受医生的影响的。

救人计划和收拾东西并不是医生的核心业务,可以通过其他人的帮助来完成,由于其他人的帮助可以更好的完成这俩非核心业务,这就说明了AOP的非核心业务是可以增强

就比如 12306里可以购买火车票是委托方

​ 飞猪,携程,智行等购买火车票是代理方,代理方不能改变售票的价格和方式,因为出票是12306大爹的核心功能,他们触及不到,但是他们可以改变抢票的速度,比如开会员买加油包,这是12306的非核心业务,他们可以增强这一业务。

所以当核心业务和非核心业务同时出现时,这样的好处有:

  • 逻辑清晰:开发核心业务的时候,不必关注增强业务的代码
  • 代码复用性高,毕竟增强代码不用重复的写。
JDK和CGLIB动态代理区别 前言 JDK动态代理实现原理(jdk8):https://blog.youkuaiyun.com/yhl_jxy/article/details/80586785 CGLIB动态代理实现原理:https://blog.youkuaiyun.com/yhl_jxy/article/details/80633194 一 JDK和CGLIB动态代理原理 1、JDK动态代理 利用拦截器(拦截器必须实现I... 阅读详情

相关推荐

jdk动态代理和cglib动态代理对比

JDK 动态代理:只代理接口(interface),无法代理类。它使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。 CGLIB 动态代理:可以代理类和接口。它通过生成目标类的子类来创建代理对象,因此可以代理没有实现接口的类。

zfj321的博客 1544

Java——JDK动态代理

动态代理是指代理类对象在程序运行时由JVM根据反射机制动态生成的。动态代理不需要定义代理类的,java源文件。动态代理其实就是jdk运行期间,动态创建class字节码并加载到JVM。动态代理的实现方式常用的有两种:使用JDK代理,与通过CGLlB动态代理。

m0_73671382的博客 7677

浅谈Spring中JDK动态代理和CGLIB动态代理

浅谈Spring中JDK动态代理和CGLIB动态代理

CharlesYooSky的博客 1993

JDK动态代理详解

可能很多小伙伴首次接触动态代理这个名词的时候,或者是在面试过程中被问到动态代理的时候,不能很好的描述出来,动态代理到底是个什么高大上的技术。不方,其实动态代理的使用非常广泛,例如我们平常使用的Spring中的注解,其依赖于AOP,而AOP的底层实现便是动态代理,看到这里,是不是更有兴趣去了解动态代理了呢?动态代理:可以分解为“动态”+“代理”。所以,静态代理存在一定的局限性,不能很好的满足需求的千变万化,动态代理的出现,就是为了解决这些局限性。

StoNENee的博客 4729

告别报错!Win10下Autodock Vina 1.2.3保姆级安装与避坑指南

本文提供了Win10系统下Autodock Vina 1.2.3的完整安装与实战指南,涵盖环境配置、分子文件预处理、对接参数优化及结果分析等关键步骤。通过详细的避坑技巧和优化方案,帮助用户高效完成分子对接任务,特别适合生物信息学研究人员和药物发现领域的初学者。

weixin_29969209的博客 402

华为IC岗笔试刷题含答案(2)

又做了几套题,记录了部分及答案,如有错误,欢迎评论指正。

Ingrid的博客 1万+

Java-JDK动态代理

介绍:我们需要掌握的程度动态代理(理解) 基于反射机制掌握的程度:1.什么是动态代理?2.动态代理能够做什么?后面我们在用Spirng和Mybatis的时候,要理解怎么使用的.代理,在我们日常生活之中就有体现,代购,中介,换ip,商家等等.比如有一家美国的大学,可以对全世界招生.留学中介(代理 )留学中介(代理):帮助这家美国的学校招生,中介是学校的代理中介是代替学校完成招生功能代理特点中介和代理他们要做的事情是一致的:招生中介是学校代理,学校是目标。

zhxingqi的博客 6358

避坑指南:STM32CubeMX配置SDIO4bit模式时为什么卡在HAL_SD_ConfigWideBusOperation?

本文深入分析了使用STM32CubeMX配置SDIO 4位模式时,程序在HAL_SD_ConfigWideBusOperation函数处卡死的常见问题。文章从硬件连接、CubeMX配置、初始化序列及HAL库底层实现等多个维度剖析根源,并提供了从初始化流程优化到增强代码鲁棒性等实战解决方案,帮助开发者彻底解决这一棘手难题。

pca5navigator的博客 825

Spring高手之路17——动态代理的艺术与实践

本文深入分析了JDK和CGLIB两种动态代理技术在Spring框架中的应用。讨论了动态代理的基础概念,通过实例展示了如何实现和应用这两种方法,并比较了它们的性能差异及适用场景。进一步,探讨了在动态代理中实现熔断限流和日志监控的策略,以及如何利用动态代理优化Spring应用的设计和功能。

卓越无关环境,保持空杯心态——靡不有初,鲜克有终 1万+

【DRAM存储器六十二】DDR5介绍--引脚和基本功能简介

详述DDR5与DDR4的引脚区别和DDR5基本功能

highman110的博客 524

MAC-电脑中的user文件夹在哪?

MAC-电脑中的user文件夹在哪?

兴趣是最好的老师 1万+

JDK动态代理

个人理解: 就是当你写了一个接口,里面有方法,然后写了实现类实现方法,完成方法逻辑,然后有一天,想对这个方法进行修改,但是不想改源码,所以有两种方式可以实现。第一种是静态代理,创建一个类继承实现类,然后对方法进行修改,这样太局限,因为只能针对特定的类增强方法,有100个实现类就要创建100个子类去实现。第二种方式是动态代理,可以动态地生成代理类,这是可以接受的。 这篇文章记录的JDK动态代理 2.创建代理类 需要实现InvocationHandler接口,重写invoke方法,这里可以对方法进行增强。 3

weixin_46666822的博客 1万+

RK3568笔记十七:LVGL v8.2移植

若该文为原创文章,转载请注明原文出处。本文介绍嵌入式图形库移植到Linux开发板ATK-RK3568上的步骤。

4231

通俗易懂 快速理解 JDK动态代理 和 cglib动态代理

动态代理有两种: ① jdk动态代理,要求必须有接口,最终生成的代理类和目标类实现相同的接口,在com.sun.proxy包下,类名为$proxy+数字 (例如:$proxy6) ② cglib动态代理,最终生成的代理类会继承目标类,并且和目标类在相同的包下

weixin_43935152的博客 1万+

射频微波电路设计【1.4】

AppCAD是一组射频设计工具和计算机应用说明,它使射频工程师能以更快和更容易的方式设计他们的产品。该软件的理 念是为工程师提供一个“个人设计助理”,即功能强大、快速和容易使用的辅助设计工具。该软件包括如下基本功能: ·各种传输线电气参数的分析与计算;·各种匹配电路的分析与计算;·各种有源和无源简单电路的分析与计算;·射频系统指标的计算:增益、噪声系数、三阶交调、信噪比、灵敏度等;·器件可靠性分析。

qq_43416206的博客 2321

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

JDK动态代理、Cglib动态代理及Spring AOP

Java中的JDK动态代理是一种通过反射机制生成代理对象的技术,使得我们能够在运行时动态地创建某个接口的代理类,而无需手动编写实现类。JDK动态代理通常用于横切关注点(如日志、事务管理、安全性等)在方法调用前后进行处理,而不需要修改目标类的源代码。

意疏的博客 6385

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JDK动态代理和CGLIB动态代理有什么区别?

JDK动态代理和CGLIB动态代理有什么区别?

水w的博客 8015

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JDK和CGLIB动态代理的区别

学习动态代理的区别

qq_59527118的博客 2万+

JDK动态代理和CGLIB动态代理的区别

目录`JDK` 动态代理`CGLIB` 动态代理 JDK 动态代理 自 JDK 1.3 以后,Java 提供了动态代理技术,允许开发者在运行期创建接口的代理实例,后来这项技术被用到了 Spring 的很多地方。JDK 动态代理主要涉及 java.lang.reflect 包下边的两个类:Proxy 和 InvocationHandler。其中,InvocationHandler 是一个接口,可以通过实现该接口定义横切逻辑(如:我们在方法执行前后打印的日志,本文只是为了演示,实际的应用一般不会只是简单的打印日

桐花思雨 7084

Cglib和jdk动态代理的区别

Cglib和jdk动态代理的区别? a) Jdk动态代理:利用拦截器(必须实现InvocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理 b) Cglib动态代理:利用ASM框架,对代理对象类生成的class文件加载进来,通过修改其字节码生成子类来处理 c) 什么时候用cglib什么时候用jdk动态代理 i. 目标对象生成了接口 ...

XiYoumengshen的博客 8569

JDK动态代理和CGLIB动态代理案例分析

JDK动态代理和CGLIB动态代理案例分析

我从不打没有准备的仗! 9811

jdk动态代理和cglib代理

SpringAOP在目标累实现接口的情况下,默认采用JDK的动态代理方式进行目标类的代理。基于CGLIB的动态代理,底层是利用ASM技术实现的,ASM动态生成目标类的子类的字节码。我们的目标类是Bus,他实现了接口Car,然后我们实现一个JdkDynamicProxyTest,JdkDynamicProxyTest持有Bus,在调用invok的时候,织入增强逻辑。CGLIB代理类代理类是目标类的子类,依赖CGLIB.JAR。cglib封装了asm,可以在运行期动态生成新的class。...

weixin_39825906的博客 3425
上一篇: Mybatis多表联合查询,嵌套查询,动态SQL
下一篇: 最简单的Java上传下载前后端实例
Debug_EDM
博客等级 码龄8年 21粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值