CGlib无入侵代理入门使用

Mybatis之jdk动态代理和cglib动态代理 一、导入jar包 相关jar包可去maven中央仓库找====》由此去 二、jdk动态代理 1、首先编写实现类和接口 接口 public interface UserDao { int add(int a,int b); } 实现类 @Component public class UsreDaoImpl implements UserDao { public int add(int a, int b) { System.out.println("执行添加"); 阅读详情
CGlib是什么?
CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
当然这些实际的功能是asm所提供的,asm又是什么?Java字节码操控框架,具体是什么大家可以上网查一查,毕竟我们这里所要讨论的是cglib,
cglib就是封装了asm,简化了asm的操作,实现了在运行期动态生成新的class。
可能大家还感觉不到它的强大,现在就告诉你。
实际上CGlib为spring aop提供了底层的一种实现;为hibernate使用cglib动态生成VO/PO (接口层对象)。

下面我们将通过一个具体的事例来看一下CGlib体验一下CGlib。
* CGlib 2.13
* ASM 2.23

以一个实例在简单介绍下cglib的应用。
我们模拟一个虚拟的场景,模拟对表的操作。
1. 开始我们对表提供了CRUD方法。
我们现在创建一个对Table操作的DAO类。
public class TableDAO {
	public void create(){
		System.out.println("create() is running !");
	}
	public void query(){
		System.out.println("query() is running !");
	}
	public void update(){
		System.out.println("update() is running !");
	}
	public void delete(){
		System.out.println("delete() is running !");
	}
}

OK,它就是一个javaBean,提供了CRUD方法的javaBean。
下面我们创建一个DAO工厂,用来生成DAO实例。
public class TableDAOFactory {
	private static TableDAO tDao = new TableDAO();
	public static TableDAO getInstance(){
		return tDao;
	}
}

接下来我们创建客户端,用来调用CRUD方法。
public class Client {

	public static void main(String[] args) {
		TableDAO tableDao = TableDAOFactory.getInstance();
		doMethod(tableDao);
	}
	public static void doMethod(TableDAO dao){
		dao.create();
		dao.query();
		dao.update();
		dao.delete();
	}
}

OK,完成了,CRUD方法完全被调用了。当然这里并没有CGlib的任何内容。问题不会这么简单的就结束,新的需求来临了。
2. 变化随之而来,Boss告诉我们这些方法不能开放给用户,只有“张三”才有权使用。阿~!怎么办,难道我们要在每个方法上面进行判断吗?
好像这么做也太那啥了吧,对了对了Proxy可能是最好的解决办法。jdk的代理就可以解决了。 好了我们来动手改造吧。等等jdk的代理需要实现接口,这样,
我们的dao类需要改变了。既然不想改动dao又要使用代理,我们这就请出CGlib。
我们只需新增一个权限验证的方法拦截器。
public class AuthProxy implements MethodInterceptor {
	private String name ;
	//传入用户名称
	public AuthProxy(String name){
		this.name = name;
	}
	public Object intercept(Object arg0, Method arg1, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		//用户进行判断
		if(!"张三".equals(name)){
			System.out.println("你没有权限!");
			return null;
		}
		return arg3.invokeSuper(arg0, arg2);
	}
}

当然不能忘了对我们的dao工厂进行修改,我们提供一个使用代理的实例生成方法
public static TableDAO getAuthInstance(AuthProxy authProxy){
	Enhancer en = new Enhancer();
	//进行代理
	en.setSuperclass(TableDAO.class);
	en.setCallback(authProxy);
	//生成代理实例
	return (TableDAO)en.create();
}

我们这就可以看看客户端的实现了。添加了两个方法用来验证不同用户的权限。
public static void haveAuth(){
	TableDAO tDao = TableDAOFactory.getAuthInstance(new AuthProxy("张三"));
	doMethod(tDao);
}
public static void haveNoAuth(){
	TableDAO tDao = TableDAOFactory.getAuthInstance(new AuthProxy("李四"));
	doMethod(tDao);
}

OK,"张三"的正常执行,"李四"的没有执行。
看到了吗?简单的aop就这样实现了
难道就这样结束了么?
3. Boss又来训话了,不行不行,现在除了"张三"其他人都用不了了,现在不可以这样。他们都来向我反映了,必须使用开放查询功能。
哈哈,现在可难不倒我们了,因为我们使用了CGlib。当然最简单的方式是去修改我们的方法拦截器,不过这样会使逻辑变得复杂,且
不利于维护。还好CGlib给我们提供了方法过滤器(CallbackFilter),CallbackFilte可以明确表明,被代理的类中不同的方法,
被哪个拦截器所拦截。下面我们就来做个过滤器用来过滤query方法。
public class AuthProxyFilter implements CallbackFilter{
	public int accept(Method arg0) {
		if(!"query".equalsIgnoreCase(arg0.getName()))
			return 0;
		return 1;
	}

}

OK,可能大家会对return 0 or 1感到困惑,用到的时候就会讲解,当然下面就会用到了。
我们在工场中新增一个使用了过滤器的实例生成方法。
public static TableDAO getAuthInstanceByFilter(AuthProxy authProxy){
	Enhancer en = new Enhancer();
	en.setSuperclass(TableDAO.class);
	en.setCallbacks(new Callback[]{authProxy,NoOp.INSTANCE});
	en.setCallbackFilter(new AuthProxyFilter());
	return (TableDAO)en.create();
}

看到了吗setCallbacks中定义了所使用的拦截器,其中NoOp.INSTANCE是CGlib所提供的实际是一个没有任何操作的拦截器,
他们是有序的。一定要和CallbackFilter里面的顺序一致。明白了吗?上面return返回的就是返回的顺序。也就是说如果调用query方法就使用NoOp.INSTANCE进行拦截。
现在看一下客户端代码。
public static void haveAuthByFilter(){
	TableDAO tDao = TableDAOFactory.getAuthInstanceByFilter(new AuthProxy("张三"));
	doMethod(tDao);

	tDao = TableDAOFactory.getAuthInstanceByFilter(new AuthProxy("李四"));
	doMethod(tDao);
}

ok,现在"李四"也可以使用query方法了,其他方法仍然没有权限。
哈哈,当然这个代理的实现没有任何侵入性,无需强制让dao去实现接口
CGLIB入门实例.doc Hibernate底层技术简介 CGLIB 立即下载

相关推荐

深入浅出CGlib-打造无入侵的类代理 - llying - ITeye技术网站

深入浅出CGlib-打造无入侵的类代理 - llying - ITeye技术网站

动态代理-cglib

使用CGLIB即使代理类没有实现任何接口也可以实现动态代理功能。cglib的原理是通过技术为一个类,并在子类中采用的技术。由于是,因此不能代理被修饰的类(代理修饰的类会抛异常,代理修饰的方法只会原样执行委托类的方法而不能做任何拦截)。但是cglib有一个很致命的缺点:cglib的底层是采用著名的字节码生成框架,使用字节码技术生成代理类,也就是通过操作字节码来生成的新的.class文件,而我们在中加载的是,也就是说我们需要可以动态生成.dex文件代理类,因此cglib在中是不能使用的。 其中,先给Enchan

清风ikl的博客 1300

Vivado DDR IP自定义型号避坑指南:如何正确填写CSV参数表(附常见错误排查)

本文详细解析了Vivado DDR IP自定义型号配置中的关键步骤与常见问题,特别针对DDR4内存颗粒的参数提取、CSV参数表填写误区及故障排查提供了实用指南。通过实际案例和调试技巧,帮助工程师避免配置陷阱,提升DDR4系统稳定性和性能。

weixin_29280657的博客 413

Cglib入门到使用

Cglib是一个强大的Java代码生成库,用于创建动态代理和增强对象。本文介绍了Cglib的基础知识、核心原理和使用方法,以及一些高级用法,如字段拦截、构造函数拦截和BeanGenerator等。Cglib提供了比Java自带的动态代理更好的性能和灵活性,可以满足各种代理需求,是Java开发人员不可或缺的工具之一。

gorgor在码农 1329

硬件开发实践:高速 PCB 差分信号与时钟同步优化

由两条互补信号线组成(正负极)接收端只关注两线之间电压差共模噪声对两线同时作用,可被抵消。

2501_93174775的博客 392

数字IC后端设计实现之Innovus POD V2 Flow性能优化全解析

本文深入解析了数字IC后端设计中的Innovus POD V2 Flow性能优化方案。该流程通过整合place_opt_design与clock_opt_design命令,实现了布局与时钟树的协同优化,有效提升了时序收敛效率、改善了设计密度与拥塞,并显著减少了迭代次数,是应对先进工艺复杂设计的关键利器。

ik6789012的博客 1238

CGLIB入门

1 简介 CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO(Persistent Object 持久化对象)字节码的动态生成。 2 示例 2.1 MethodInterceptor的使用 原始类: public class Targe

八白龙的专栏 477

保姆级避坑指南:在Ubuntu 22.04上用ROS2 Humble搞定TurtleBot3的SLAM与导航(附5个常见报错解决方案)

本文提供了一份详细的Ubuntu 22.04上使用ROS2 Humble和TurtleBot3进行SLAM建图与导航的避坑指南,涵盖Gazebo启动失败、场景加载问题、环境变量设置、GLIBCXX版本冲突及Nav2参数配置等5个常见报错的解决方案,帮助开发者高效完成机器人导航项目。

weixin_29062823的博客 285

CGLib简单入门

一、CGlib简介          CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。 当然这些实际的功能是asm所提供的,asm又是什么?Java字节码操控框架,具体是什么大家可以上网查一查,毕竟我们这里所要讨论的是cglib。cglib就是封装了asm,简化了asm的操作,实现了在运行期动态生成新的class。 可能大家还感觉不到它的

零度的博客专栏 2772

第五章 PCIe介绍 5.1-5.7

为什么SSD要用PCIe接口?因为它快,比SATA快。通道,PCIe最多可以有32个通道。两个设备之间的PCIe连接,叫做一个Link。如下图,设备A和设备B是个双向连接,两个PCIe设备之间,有专门的发送和接收通道,数据可以同时往两个方向传输,PCIe Spec称这种工作模式为,可以理解为。和PCIe一样,SATA有独立的发送和接收通道。但与PCIe工作模式不一样,同一时间,SATA只有一条通道可以进行数据传输。这种工作模式称为。与SATA单通道不同,PCIe连接可以通过增加通道数扩展带宽。

fengbaobaola的博客 2967

进阶06:C#连接TwinCAT 3使用ADS通讯

本文介绍了使用C#通过ADS协议与倍福TwinCAT3 PLC通讯的实现方法。主要内容包括:1)在两台电脑上安装TwinCAT3开发环境并建立网络连接;2)在TwinCAT中定义变量和结构体;3)使用C# Winform开发界面,通过TwinCAT.Ads.dll实现读写功能;4)实现主动读取和通知两种数据获取方式。详细说明了连接建立、变量定义、读写操作及事件通知的实现代码。该方案实现了对PLC寄存器数据的实时监控和操作,为工业控制系统的开发提供了参考。

weixin_38637405的博客 3688

CGlib 入门

CGlib 入门cglib github地址链接。项目maven构建:<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.1</version> </dependency> 项目gradle构建:dependencies { compile 'cglib:cgl

rodbate的博客 2423

Ubuntu零基础入门到精通【1.1讲】:什么是 Ubuntu?一文带你彻底搞懂!

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 5694

Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理

小编这些年深知大多数初中级工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Java全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!如果你需要这些资料,⬅专栏获取第一步,进入到了log动态代理,执行 调用主业务方法 前 的 代码;

2401_85763952的博客 1109

html2canvas - 解决截图后引入的字体样式丢失问题,第三方字体截图导出图片后字体失效,html2canvas截屏生成图片后艺术字体就丢失并且自动转成常规字体了,特殊字体显示不了无法截图怎么办

vue2,vue3,uniapp,html2canvas截图后引入的字体样式丢失,html2canvas艺术字截图不显示,使用外部字体无效,html2canvas无法识别网络字体文件怎么办,ttf文件,网页使用在线字体链接利用html2canvas无法截取,字体样式没有了,font-family第三方字体,@font-face引入本地字体文件后无法被html2canvas识别怎么办,html2canvas文字消失,vue页面正常显示艺术字体但截屏后没有,html2canvas截图存在特殊字体时截图不全,默认

✅ 精选推荐文章 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理

前言 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 很多人至今都是看到代理就懵, 静态代理、动态代理、JDK动态代理、CGLIB动态代理...... 您这种症状持续多久了? 现在看这篇文章,还来得及。 悄咪咪地进入正文 一、代理模式 代理模式分为: 静态代理 动态代理 先不管什么静还是动的,先知道这个代理模式的使用,是干嘛的。 文字描述: 为其他对象提供一个代理以控制对某个对象的访问。 ...

默默不代表沉默 2148

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深入浅出CGlib-打造无入侵的类代理

CGlib是什么? CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。 当然这些实际的功能是asm所提供的,asm又是什么?Java字节码操控框架,具体是什么大家可以上网查一查,毕竟我们这里所要讨论的是cglib, cglib就是封装了asm,简化了asm的操作,实现了在运行期动态生成新的class。 可能大家还感觉不到它的强大,现在...

llying 311

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java三种代理模式:静态代理,JDK动态代理,CGLIB代理

参考:https://segmentfault.com/a/1190000011291179 代理主要的作用是是在一个方法使用前后,能进行别的处理,比如:日志相关 静态代理 代理方式:代理对象和目标对象都需要实现相同的接口类 1.定义接口UserService(接口类) 2.定义接口的实现类UserServiceImpl(目标对象) 3.定义代理类UserProxy(代理对象)...

Peacock__的博客 466

jdk动态代理和cglib动态代理详解

本文内容概括: 静态代理概述 基于继承方式实现静态代理 基于聚合方式实现静态代理 jdk动态代理实现 如何实现一个HashMap的动态代理类 cglib动态代理实现 jdk和cglib代理的区别 动态代理和静态代理的区别 spring如何选择jdk和cglib代理 如上图,代理模式可分为动态代理和静态代理,我们比较常用的有动态代理中的jdk动态代理和Cglib代理,像spr...

分享传递价值 9992

java代理设计模式讲解,cglib jdk动态代理 的使用初探与错误分析

java 代理

m0_46804015的博客 461

动态代理jdk和cglib

动态代理

qq_43171656的博客 829

java 静态代理 动态代理(jdk、cglib两种方式)

静态代理,jdk动态代理,cglib动态代理

Don't lost way 934
上一篇: JDK动态代理为什么必须用接口
下一篇: ConcurrentHashMap的锁
架构师的清醒
博客等级 码龄14年 291粉丝 397原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值