使用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使用的核心技术是动态代理,说到动态代理就不得不和设计模式中的代理模式联系起来,通过代理模式我们可以对目标类进行功能增强,在某个方法的执行前后增加一些操作,例如计算方法执行效率.打印 ...
随机推荐
- kaldi使用cvte模型进行语音识别
操作系统 : Unbutu18.04_x64 gcc版本 :7.4.0 该模型在thch30数据集上测试的错误率只有8.25%,效果还是不错的. 模型下载地址: http://www.kaldi-as ...
- python问题:IndentationError:expected an indented block
Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的Python程序员,也可能陷入陷阱当中.最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分 ...
- The usage of Markdown---代码块
目录 1. 序言 2. 代码块 3. 引用中的代码 4. 列表中的代码块 更新时间:2019.09.14 1. 序言 在写技术博客的时候,我们常常需要添加一下代码块用来做演示说明,实际上在这篇博客 ...
- 接口 IEnumerable
C#提供了可供类继承的接口,在此解释一下经常遇到的IEnumerable,在此首相解释一下接口,如下例所示: /// <summary> /// 简述Interface的用法 /// &l ...
- 通俗地说逻辑回归【Logistic regression】算法(一)
在说逻辑回归前,还是得提一提他的兄弟,线性回归.在某些地方,逻辑回归算法和线性回归算法是类似的.但它和线性回归最大的不同在于,逻辑回归是作用是分类的. 还记得之前说的吗,线性回归其实就是求出一条拟合空 ...
- 部署spring boot + Vue遇到的坑(权限、刷新404、跨域、内存)
部署spring boot + Vue遇到的坑(权限.刷新404.跨域.内存) 项目背景是采用前后端分离,前端使用vue,后端使用springboot. 工具 工欲善其事必先利其器,我们先找一个操作L ...
- Vue.js应用基础
声明 这篇博文是我的Vue学习记录,其中参杂了不少我个人的理解,由于我并没有继续学习Vue的源码,所以不能保证这些理解都是正确的.如果这篇博文有幸被你读到,请带着批判的心情去审视它. 如果你发现了其中 ...
- Hadoop3.2.1版本的环境搭建
最近有人提出能不能发一些大数据相关的知识,No problem ! 今天先从安装环境说起,搭建起自己的学习环境. Hadoop的三种搭建方式以及使用环境: 单机版适合开发调试: 伪分布式适合模拟集群学 ...
- 第5天,python之路
已经过了两三天了,东西一点没来写,今天慢慢的写吧. 还是会按Alex Li的流程来学习,编写 写出自己的东西 常用的数据类型 简单的有,str ,int , 常用的: 列表list[], 字 ...
- 最适合Java开发者的一本书和一软件
一书-<Java编程思想> 一软件-IntelliJ IDEA Java自学是否可以成功,答案显而易见,可以. 自学Java关键看自己是否有毅力.是否有恒心. 自学Java 自学Java不 ...