利用代码分别实现jdk动态代理和cglib动态代理_设计模式专题04-代理模式
代理模式(下一篇:建造者模式)
![](/assets/blank.gif)
什么是代理模式
通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现) ,AOP核心技术面向切面编程。
![](/assets/blank.gif)
代理模式应用场景
SpringAOP、事物原理、日志打印、权限控制、远程调用、安全代理 可以隐蔽真实角色
代理的分类
静态代理(静态定义代理类)
动态代理(动态生成代理类)
Jdk自带动态代理
Cglib 、javaassist(字节码操作库)
静态代理
什么是静态代理
由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
静态代理代码
public interface IUserDao {void save();}public class UserDao implements IUserDao {public void save() {System.out.println("已经保存数据...");}}代理类public class UserDaoProxy implements IUserDao {private IUserDao target; public UserDaoProxy(IUserDao iuserDao) {this.target = iuserDao;} public void save() {System.out.println("开启事物...");target.save();System.out.println("关闭事物...");} }
动态代理
什么是动态代理
1.代理对象,不需要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3.动态代理也叫做:JDK代理,接口代理
JDK动态代理
1)原理:是根据类加载器和接口创建代理类(此代理类是接口的实现类,所以必须使用接口 面向接口生成代理,位于java.lang.reflect包下)
2)实现方式:
1. 通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(…);
2. 通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类Class clazz = Proxy.getProxyClass(classLoader,new Class[]{…});
3. 通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
4. 通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
缺点:jdk动态代理,必须是面向接口,目标业务类必须实现接口
// 每次生成动态代理类对象时,实现了InvocationHandler接口的调用处理器对象 public class InvocationHandlerImpl implements InvocationHandler {private Object target;// 这其实业务实现类对象,用来调用具体的业务方法// 通过构造函数传入目标对象public InvocationHandlerImpl(Object target) {this.target = target;} public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = null;System.out.println("调用开始处理");result = method.invoke(target, args);System.out.println("调用结束处理");return result;} public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException,IllegalAccessException, IllegalArgumentException, InvocationTargetException {// 被代理对象IUserDao userDao = new UserDao();InvocationHandlerImpl invocationHandlerImpl = new InvocationHandlerImpl(userDao);ClassLoader loader = userDao.getClass().getClassLoader();Class>[] interfaces = userDao.getClass().getInterfaces();// 主要装载器、一组接口及调用处理动态代理实例IUserDao newProxyInstance = (IUserDao) Proxy.newProxyInstance(loader, interfaces, invocationHandlerImpl);newProxyInstance.save();} }
CGLIB动态代理
原理:利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
什么是CGLIB动态代理
使用cglib[Code Generation Library]实现动态代理,并不要求委托类必须实现接口,底层采用asm字节码生成框架生成代理类的字节码
CGLIB动态代理相关代码
public class CglibProxy implements MethodInterceptor {private Object targetObject;// 这里的目标类型为Object,则可以接受任意一种参数作为被代理类,实现了动态代理public Object getInstance(Object target) {// 设置需要创建子类的类this.targetObject = target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(target.getClass());enhancer.setCallback(this);return enhancer.create();} public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("开启事物");Object result = proxy.invoke(targetObject, args);System.out.println("关闭事物");// 返回代理对象return result;}public static void main(String[] args) {CglibProxy cglibProxy = new CglibProxy();UserDao userDao = (UserDao) cglibProxy.getInstance(new UserDao());userDao.save();}}
CGLIB动态代理与JDK动态区别
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
Spring中。
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
JDK动态代理只能对实现了接口的类生成代理,而不能针对类 。CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 。因为是继承,所以该类或方法最好不要声明成final ,final可以阻止继承和多态。
利用代码分别实现jdk动态代理和cglib动态代理_设计模式专题04-代理模式相关推荐
- 利用代码分别实现jdk动态代理和cglib动态代理_面试之动态代理
大家好!我是CSRobot,从今天开始,我将会发布一些技术文章,内容就是结合春招以来的面试所遇到的问题进行分享,首先会对知识点进行一个探讨和整理,在最后会给出一些面试题并作出解答,希望可以帮助到大家! ...
- JDK动态代理和CGLib动态代理简单演示
JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...
- 【Spring6】| GoF之代理模式(JDK动态代理和CGLIB动态代理)
目录 一:GoF之代理模式 1. 对代理模式的理解 2. 静态代理 3. 动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 一:GoF之代理模式 1. 对代理模式的理解 生活场景1:牛村的 ...
- 什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。
1. 代理模式有什么用 ①功能增强,在实现目标功能的基础上,又增加了额外功能.就像生活中的中介一样,他跟两边客户会有私下的交流. ②控制访问,代理不让用户直接和目标接触.就像中间商一样,他们不会让我们 ...
- Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理
Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...
- JAVA 进阶篇 动态代理 JDK动态代理和CGlib动态代理
JDK动态代理和CGlib动态代理 JDK动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. CGlib动态代理: 利用ASM(开源的Java ...
- Java两种动态代理JDK动态代理和CGLIB动态代理
目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...
- Spring AOP之---基于JDK动态代理和CGLib动态代理的AOP实现
AOP(面向切面编程)是OOP的有益补充,它只适合那些具有横切逻辑的应用场合,如性能监测,访问控制,事物管理,日志记录等.至于怎么理解横切逻辑,敲完实例代码也就明白了. 为什么要使用AOP,举个栗子: ...
- Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别
视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...
- jdk动态代理和cglib动态代理实现及区别
代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 代理模式又分为:静态代理.jdk动态代 ...
最新文章
- 三剑客”之Swarm应用数据持久化管理(volume 、bind 、 nfs)
- centos6.5编译安装php7,及配置与nginx通信。
- hdu 4739 状压DP
- C指针原理(14)-C指针基础
- python输出指定字符串_Python输出指定字符串的方法
- 【转】MS-DOS下怎样使用解压缩共具
- 惠普cq40无线网卡驱动_网友问题解答:雷哥我惠普的电脑搜索不到自己的手机热点啊?...
- OpenCV重复播放摄像头视频,循环播放摄像头(视频)文件,循环播放视频中某一段视频
- 光标函数的使用 gotoxy()
- 销售管理软件系统的两大优势是什么?
- 【C++决赛】2019年全国高校计算机能力挑战赛决赛C++组题解
- openwrt 挂载硬盘NFS共享,非SMB共享
- 7年加工作经验的程序员,从大厂跳槽出来,遭遇了什么?
- word@tips官方文档和教程@软件界面介绍@功能区自定义@拼写检查@AI润色改进@ 图片顶部上方插入文字
- 如何在小程序的wxml中书写函数逻辑,wxs的使用
- @Value注解使用过程中遇到的一些坑
- 第十一天: SD卡原理分析及SD卡启动详解
- shell脚本回车换行,bash shell的脚本 - 回车键/确认键
- 猴子钦定大王(循环单链表)
- 小学数学考试系统java_C语言项目小学生数学考试系统参考
热门文章
- python用api调用c语言_在C/C++程序中调用High Level的Python API
- 计算机网络入侵技术初探论文答辩,浅谈关于计算机网络入侵报警系统技术的研究.doc...
- ①RabbitMQ 消息中间件/消息队列、单节点、集群、镜像集群
- 2022-4-16 Leetcode 633.平方数之和
- win10千万不要重置_win10更新失败蓝屏修复方法.
- 在windows 2008 server 的IIS 7上运行 django 1.11 + python 3.6
- C++基础与深度解析 || 加减法练习
- 2022-1-25 Leetcode 970.强整数
- 2022-1-21 Leetcode 599. 两个列表的最小索引总和
- Idea工具,窗口布局全乱了,怎样恢复到原始界面,但又不用重新导入项目?