JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理
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版本降级,否则也会报错)
总结:
JDK代理使用的是反射机制实现aop的动态代理,CGLIB代理使用字节码处理框架asm,通过修改字节码生成子类。所以jdk动态代理的方式创建代理对象效率较高,执行效率较低,cglib创建效率较低,执行效率高;
JDK动态代理机制是委托机制,具体说动态实现接口类,在动态生成的实现类里面委托hanlder去调用原始实现类方法,CGLIB则使用的继承机制,具体说被代理类和代理类是继承关系,所以代理类是可以赋值给被代理类的,如果被代理类有接口,那么代理类也可以赋值给接口。
JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理相关推荐
- Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别
视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...
- Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理
Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...
- Java两种动态代理JDK动态代理和CGLIB动态代理
目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...
- 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。
1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...
- 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理
大家好!我是CSRobot,从今天开始,我将会发布一些技术文章,内容就是结合春招以来的面试所遇到的问题进行分享,首先会对知识点进行一个探讨和整理,在最后会给出一些面试题并作出解答,希望可以帮助到大家! ...
- JDK动态代理和CGLib动态代理简单演示
JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...
- Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!
作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...
- Spring AOP之---基于JDK动态代理和CGLib动态代理的AOP实现
AOP(面向切面编程)是OOP的有益补充,它只适合那些具有横切逻辑的应用场合,如性能监测,访问控制,事物管理,日志记录等.至于怎么理解横切逻辑,敲完实例代码也就明白了. 为什么要使用AOP,举个栗子: ...
- 【Spring6】| GoF之代理模式(JDK动态代理和CGLIB动态代理)
目录 一:GoF之代理模式 1. 对代理模式的理解 2. 静态代理 3. 动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 一:GoF之代理模式 1. 对代理模式的理解 生活场景1:牛村的 ...
最新文章
- git如何强制用远程分支更新本地
- MySQL高级 - 案例 - 系统性能优化 - 读写分离概述
- $unit编译单元声明
- 24.QTreeWidget的用法
- C++ (MFC)将字符串保存到指定目录下的文本中
- 转自《我的2017,熠熠生辉》的沙发评论
- win10提示“应用程序无法正常启动 0xc0150002”怎么办
- IDEA 创建文件类型与预期文件类型不符时,如何更改
- 39. 网络管理之IP配置,查看当前IP和网络设备,网络配置文件(ifcfg-网卡)详解,配置静态IP,配置动态IP,临时设置,/etc/sysconfig/network-scripts/ifcfg
- Android笔记-Felix
- 远程操控计算机,将手机平板与电脑连接起来--随时办公
- FLOJET NEMP50/7泵
- [渝粤教育] 浙江大学 2021秋冬微积分(一) 参考 资料
- Win32病毒入门 -- ring3篇
- 3-3存储系统-高速缓冲存储器Cache
- 访问学者如何申请美国J1签证?
- 《百年中国文学史》狂人日记
- 使用代理模式手写简单的数据库连接池
- 虚拟机黑群晖联机失败问题
- Zookeeper客户端错误 Unable to read additional data from server