使用CGLIB实现动态代理
参考:https://blog.csdn.net/yhl_jxy/article/details/80633194#comments
CGLIB动态代理
定义:CGLIB(code genaration libary), 代码自动生成类库。
在程序运行中自动生成扩展类和实现java接口,是一个强大的高性能的代码生成包
CGLIB动态代理的实现
1)、导入cglib所需的jar包
2)、实现MethodIntercetor类,实现代理类对象的具体逻辑
重写intercept()方法,在intercept方法中实现代理的逻辑
intercept(Object o, Method method, Object[] Objects, MehodProxy methodProxy )
o: 被代理类对象
method: 被代理类的方法
objects: 被代理类方法的参数
methodProxy: 调用被代理类对象的参数
3)、使用Enhance生成代理类对象
enhance.create() //生成代理类对象
使用CGLIB实现延迟加载
MehodInterceptor实现类:
/**
* 实现代理的逻辑
* 步骤:
* --: 1、实现MethodInterceptor拦截器
* o: 被代理对象
* method: 被代理对象的方法
* objects: 被代理对象的方法参数
* methodProxy: 触发父类方法的对象
*/
public class DBQueryCglibMethodInterceptor implements MethodInterceptor {
DBQuery dbQuery = null;
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
if(dbQuery == null){
dbQuery = new DBQuery();
}
return dbQuery.Request();
}
}
真实类:
/**
* 使用cglib来实现数据库的查询
*/
public class DBQuery {
public String Request(){
return "数据库查询完毕";
}
}
使用类:
public class Client {
public static void main(String[] args) {
/**
* 创建增强类对象
*/
Enhancer enhancer = new Enhancer();
/**
* 创建增强类的父类对象
*/
enhancer.setSuperclass(DBQuery.class);
/**
* 创建拦截切入类
*/
enhancer.setCallback(new DBQueryCglibMethodInterceptor());
/**
* 创建代理对象
*/
DBQuery dbQueryProxy = (DBQuery) enhancer.create();
String result = dbQueryProxy.Request();
System.out.println(result);
}
}
结果:
数据库查询完毕
使用CGLIB增强原有类的功能
MethodIntercptor实现类
/**
* cglib代理逻辑切入类
* ---: intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
* o: 被代理类对象
* method: 要拦截的被代理类的方法
* objects:被代理类的方法参数
* methodyProxy: 要触发父类的方法对象
*/
public class CglibMethodInteceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("插入前置通知");
Object object = methodProxy.invokeSuper(o, objects);
System.out.println("插入后置通知");
return object;
}
}
真实类:
/**
* 使用cglib实现动态代理,不用创建接口
*/
public class HelloService {
HelloService(){
System.out.println("HelloServie构造器");
}
public final String sayOthers(String name){
System.out.println("HelloService: sayOthers" +name);
return null;
}
public void sayHello(){
System.out.println("HelloService: sayHello");
}
public void sayByeBye(){
System.out.println("HelloService: sayByeBye");
}
}
使用类:
public class Client {
public static void main(String[] args) {
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\code");
/**
* 创建增强类对象
*/
Enhancer enhancer = new Enhancer();
/**
* 创建需要增强的父类对象
*/
enhancer.setSuperclass(HelloService.class);
/**
* 设置切入类对象
*/
enhancer.setCallback(new CglibMethodInteceptor());
/**
* 生成代理对象
*/
HelloService service = (HelloService) enhancer.create();
service.sayHello();
service.sayByeBye();
}
}
结果:
HelloServie构造器
插入前置通知
HelloService: sayHello
插入后置通知
插入前置通知
HelloService: sayByeBye
插入后置通知
使用CGLIB实现动态代理的更多相关文章
- cglib实现动态代理简单使用
Boss: package proxy.cglib; public class Boss{ public void findPerson() { System.out.println("我要 ...
- JDK 和 CGLib 实现动态代理和区别
JDK 和 CGLib 实现动态代理和区别 在日常的开发中,Spring AOP 是一个非常常用的功能.谈到 AOP,自然离不开动态代理. 那么,基于 JDK 和 CGLib 如何实现动态代理,他们之 ...
- jdk与cglib的动态代理
JDK动态代理中包含一个类和一个接口: InvocationHandler接口: public interface InvocationHandler { public Object invoke(O ...
- 详解Java动态代理机制(二)----cglib实现动态代理
上篇文章的结尾我们介绍了普通的jdk实现动态代理的主要不足在于:它只能代理实现了接口的类,如果一个类没有继承于任何的接口,那么就不能代理该类,原因是我们动态生成的所有代理类都必须继承Proxy这个类, ...
- JDK和CGLIB生成动态代理类的区别
关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代 ...
- CGLIB实现动态代理
JDK动态代理和CGLIB字节码生成的区别? * JDK动态代理只能对实现了接口的类生成代理,而不能针对类 * CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承 ...
- 【4】JDK和CGLIB生成动态代理类的区别
当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代理:事先写好代理对象类,在 ...
- JDK和CGLIB生成动态代理类的区别(转)
关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代 ...
- JDK和Cglib实现动态代理实例及优缺点分析
Spring AOP使用的核心技术是动态代理,说到动态代理就不得不和设计模式中的代理模式联系起来,通过代理模式我们可以对目标类进行功能增强,在某个方法的执行前后增加一些操作,例如计算方法执行效率.打印 ...
随机推荐
- Arduino学习笔记⑧ 红外通信
1.前言 红外通信是一种利用红外光编码进行数据传输的无线通信方式,在目前来说是使用非常广泛的.生活中常见电视遥控器,空调遥控器,DVD遥控器(现在估计是老古董了),均使用红外线遥控.使用红外线 ...
- .NET Core 3.0 构建和部署
Default Executables 默认可执行文件 在 dotnet build 或 dotnet publish 期间,将创建一个与你使用的 SDK 的环境和平台相匹配的可执行文件. 和其他本机 ...
- 在react项目中使用redux or mobx?
主要比较参数: 库体积,打包项目体积 开发体验 性能对比 在对比参数前首先分析一下redux和mobx的设计模式,redux和mobx都没有使用传统的mvc/mvvm形式,而且他们使用flux结构也略 ...
- Java11新特性 - Epsilon GC和ZGC
Java11中新增了两个GC,Epsilon GC和ZGC. Epsilon垃圾收集器 A NoOp Garbage Collector 没有操作的垃圾收集器 JDK上对这个特性的描述是:开发一个处理 ...
- 计算机网络(1)- TCP
TCP的全称是传输控制协议(Transmission Control Protocol)[RFC 793] TCP提供面向连接的服务.在传送数据之前必须先建立连接,数据传送结束后要释放连接.TCP不提 ...
- Java基础(三)对象与类
1.类的概念:类是构造对象的模板或蓝图.由类构造对象的过程称为创建类的实例. 2.封装的概念:封装(有时称为数据隐藏)是与对象有关的一个重要概念.对象中的数据称为实例域,操纵数据的过程称为方法.对于每 ...
- python的GIL锁
进程:系统运行的一个程序,是系统分配资源的基本单位. 线程:是进程中执行运算的最小单位,是处理机调度的基本单位. 处理机:是计算机中存储程序和数据,并按照程序规定的步骤执行指令的部件.包括中央处理器. ...
- Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- 第三十章 System V信号量(一)
信号量 信号量和P.V原语由Dijkstra(迪杰斯特拉)提出 信号量: 互斥: P.V在同一进程中 同步: P.V在不同进程中 信号量值含义 S>0 : S表示可用资源个数 S=0 : 表示无 ...
- lua程序设计(一)
摘要:lua程序设计第二版学习笔记 脚本语言的基础语法大都比较简单,这里只列举一些lua独有,或者需要特别注意的语法点. 书中前三章的内容是一些惯常的引言,基础数据类型,运算符等内容,相对简单,这里就 ...