JDK动态代理和CGlib动态代理

JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
CGlib动态代理: 利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
区别: JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。

一、JDK动态代理:

我们举个简单的例子:
有一个接口,定义了一个sum()方法:

/*** 目标接口类*/
public interface Computer {int sum(int a,int b);
}

当然还有它的实现类:

/*** 接口实现类*/
public class ComputerImpl implements Computer {@Overridepublic int sum(int a, int b) {return a+b;}
}

接着我们定义一个代理类,用来在执行的时候加入一些操作(逻辑验证或者业务需求相关的操作等)

public class ComputerProxy implements InvocationHandler {Object target;//目标public ComputerProxy(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {check();Object result = method.invoke(target, args);return result;}private void check(Object... args) {// 模拟其他操作   System.out.println("我在检查");    }
}

那么代理有了,我们要怎么使用呢?
下面我们在测试类中去执行:

public class Test {public static void main(String[] args) {//正常调用Computer computer=new ComputerImpl();int sum = computer.sum(1, 2);System.out.println(sum);//利用JDK动态代理调用//目标对象Computer target = new ComputerImpl();//代理对象ComputerProxy proxy=new ComputerProxy(target);//生成动态代理Computer jdkProxy = (Computer) Proxy.newProxyInstance(Computer.class.getClassLoader(),new Class[]{Computer.class}, proxy);int result = jdkProxy.sum(1, 2);System.out.println(result);}
}

二、CGlib动态代理:

CGlib方式生成动态代理的步骤与JDK生成大致相同,只是在配置动态代理的时候需要调用其他的接口,而JDK是原生的不需要导入Jar包
所以如果要使用Spring动态代理,必须导入spring-aop 这个jar包
下载地址: https://repo.spring.io/release/org/springframework/spring/
具体配置如下:
Spring代理实例

public class SpringProxy implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {//获取目标方法参数Object[] arguments = methodInvocation.getArguments();//模拟其他操作check(arguments);//调用目标方法Object result = methodInvocation.proceed();return result;}private void check(Object... args) {// 模拟其他操作System.out.println("我在检查!");}
}

xml文件配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1、目标对象 -->
<bean id="target" class="com.cc.dao.impl.ComputerImpl"/>
<!-- 2、Spring代理实例 -->
<bean id="springProxy" class="com.cc.proxy.SpringProxy"/>
<!--3、代理对象:是目标对象与Spring代理融合体(cglib) -->
<bean  id="ComputerProxy" class="org.springframework.aop.framework.ProxyFactoryBean"><!-- 1)注入目标对象  --><property name="targetName" value="target"/><!-- 2)Spring代理实例  --><property name="interceptorNames"><array><value>springProxy</value></array></property>
</bean>
</beans>

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:beans2.xml")
public class SpringHkTest1 {@Autowired@Qualifier("ComputerProxy")private  Computer computer;@Testpublic void testSpringHk() {System.out.println( computer.sum(30, 5));;}
}

注意:在编写测试类时不能使用main方法运行,因为main方法不会开启注解扫描,会报错,需要在Test单元测试中开启(另外junit4.10以上的版本是没有集成hamcrest-core-1.3.jar包的,需要额外下载这个包,或者将junit版本降级,否则也会报错)

总结:

  1. JDK代理使用的是反射机制实现aop的动态代理,CGLIB代理使用字节码处理框架asm,通过修改字节码生成子类。所以jdk动态代理的方式创建代理对象效率较高,执行效率较低,cglib创建效率较低,执行效率高;

  2. JDK动态代理机制是委托机制,具体说动态实现接口类,在动态生成的实现类里面委托hanlder去调用原始实现类方法,CGLIB则使用的继承机制,具体说被代理类和代理类是继承关系,所以代理类是可以赋值给被代理类的,如果被代理类有接口,那么代理类也可以赋值给接口。

JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理相关推荐

  1. Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

    视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...

  2. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  3. Java两种动态代理JDK动态代理和CGLIB动态代理

    目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...

  4. 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。

    1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...

  5. 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理

    大家好!我是CSRobot,从今天开始,我将会发布一些技术文章,内容就是结合春招以来的面试所遇到的问题进行分享,首先会对知识点进行一个探讨和整理,在最后会给出一些面试题并作出解答,希望可以帮助到大家! ...

  6. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  7. Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!

    作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...

  8. Spring AOP之---基于JDK动态代理和CGLib动态代理的AOP实现

    AOP(面向切面编程)是OOP的有益补充,它只适合那些具有横切逻辑的应用场合,如性能监测,访问控制,事物管理,日志记录等.至于怎么理解横切逻辑,敲完实例代码也就明白了. 为什么要使用AOP,举个栗子: ...

  9. 【Spring6】| GoF之代理模式(JDK动态代理和CGLIB动态代理)

    目录 一:GoF之代理模式 1. 对代理模式的理解 2. 静态代理 3. 动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 一:GoF之代理模式 1. 对代理模式的理解 生活场景1:牛村的 ...

最新文章

  1. git如何强制用远程分支更新本地
  2. MySQL高级 - 案例 - 系统性能优化 - 读写分离概述
  3. $unit编译单元声明
  4. 24.QTreeWidget的用法
  5. C++ (MFC)将字符串保存到指定目录下的文本中
  6. 转自《我的2017,熠熠生辉》的沙发评论
  7. win10提示“应用程序无法正常启动 0xc0150002”怎么办
  8. IDEA 创建文件类型与预期文件类型不符时,如何更改
  9. 39. 网络管理之IP配置,查看当前IP和网络设备,网络配置文件(ifcfg-网卡)详解,配置静态IP,配置动态IP,临时设置,/etc/sysconfig/network-scripts/ifcfg
  10. Android笔记-Felix
  11. 远程操控计算机,将手机平板与电脑连接起来--随时办公
  12. FLOJET NEMP50/7泵
  13. [渝粤教育] 浙江大学 2021秋冬微积分(一) 参考 资料
  14. Win32病毒入门 -- ring3篇
  15. 3-3存储系统-高速缓冲存储器Cache
  16. 访问学者如何申请美国J1签证?
  17. 《百年中国文学史》狂人日记
  18. 使用代理模式手写简单的数据库连接池
  19. 虚拟机黑群晖联机失败问题
  20. Zookeeper客户端错误 Unable to read additional data from server

热门文章

  1. 思科模拟器动态路由器的配置(rip)
  2. 如何让机器理解汉字一笔一画的奥秘?
  3. 爬虫——Scrapy框架案例一:手机APP抓包
  4. BreederDAO 直播AMA 1:与创始人会面回顾
  5. 无人驾驶卡车开上干线,嬴彻科技、主线科技们如何拿下产业化赛点?
  6. 综合案例之学成在线首页
  7. 隐马尔可夫模型HMM
  8. 微信中H5+java+vue获取微信定位等JS-SDK
  9. 借微信更新说说有关版本的那些事儿
  10. Python中的numpy.cumsum()