用 javassist 解决 JDK 动态代理的缺陷

  • JDK动态代理的缺陷

    要求目标类必须实现接口,否则产生不了代理。有些场景下,目标类也要产生代理类但是木有实现接口,这个时间 Java 中有两个常用类库:1)javassist http://www.javassist.org/
  2) cglib 帮我们对木有实现接口的目标类产生代理

  • 添加依赖
<dependency>
  <groupId>org.javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.25.0-GA</version>
</dependency
  • 新建类
public class BookDaoImpl3 {
  public void insert() {
    System.out.println("插入书籍");
  }
  public void update() {
    System.out.println("修改书籍");
  }
  public void del() {
    ////
    System.out.println("删除书籍");
  }
}
  • 测试代码
public class Test03 {
public static void main(String[] args) throws
InstantiationException, IllegalAccessException {
//租房子的人
BookDaoImpl3 target=new BookDaoImpl3();
//中介:基于 javassist 的动态代理,不要求实现代理
ProxyFactory factory=new ProxyFactory();
factory.setSuperclass(BookDaoImpl3.class);
factory.setHandler(new MethodHandler() {
@Override
public Object invoke(Object self, Method thisMethod,
Method proceed, Object[] args) throws Throwable {
//这里放置重复代码
Object ret=null;
try {
System.out.println("============================");
System.out.println("开启会话");
////
ret= thisMethod.invoke(target, args);//让不同代
码执行,不同代码再方法中
///
System.out.println("事务提交");
} catch (Exception e) {
System.out.println("事务回滚");
e.printStackTrace();
} finally {
System.out.println("关闭会话");
}
return ret;
}
});
Class clazz=factory.createClass(); BookDaoImpl3 proxy=(BookDaoImpl3) clazz.newInstance();
proxy.del();
proxy.update();
proxy.insert();
}
}
  • 不同点分析

      


用 CGLIB 解决 JDK 动态代理的缺陷

  • 添加依赖
<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>3.3.0</version>
</dependency>
  • 测试
public class Test04 {
public static void main(String[] args) throws InstantiationException,
IllegalAccessException {
//租房子的人
BookDaoImpl3 target=new BookDaoImpl3();
//中介:基于 CGLIB 的动态代理,不要求实现代理
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(BookDaoImpl3.class);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
//这里放置重复代码
Object ret=null;
try {
System.out.println("============================");
System.out.println("开启会话");
////
ret= method.invoke(target, args);//让不同代码执行,不同代码再方法

///
System.out.println("事务提交");
} catch (Exception e) {
System.out.println("事务回滚");
e.printStackTrace();
} finally {
System.out.println("关闭会话");
}
return ret;
}
}); BookDaoImpl3 proxy=(BookDaoImpl3) enhancer.create();
proxy.del();
proxy.update();
proxy.insert();
}
}
  • 不同点分析



用javassist和CGLIB 解决JDK动态代理的缺陷的更多相关文章

  1. 面试造火箭系列,栽在了cglib和jdk动态代理

    "喂,你好,我是XX巴巴公司的技术面试官,请问你是张小帅吗".声音是从电话那头传来的 "是的,你好".小帅暗喜,大厂终于找上我了. "下面我们来进行一 ...

  2. 学习CGLIB与JDK动态代理的区别

    动态代理 代理模式是Java中常见的一种模式.代理又分为静态代理和动态代理.静态代理就是显式指定的代理,静态代理的优点是由程序员自行指定代理类并进行编译和运行,缺点是一个代理类只能对一个接口的实现类进 ...

  3. Cglib 与 JDK动态代理的运行性能比较

    都说 Cglib 创建的动态代理的运行性能比 JDK 动态代理能高出大概 10 倍,今日抱着怀疑精神验证了一下,发现情况有所不同,遂贴出实验结果,以供参考和讨论. 代码很简单,首先,定义一个 Test ...

  4. Cglib 与 JDK动态代理

    作者:xiaolyuh 时间:2019/09/20 09:58 AOP 代理的两种实现: jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到: cglib是子类,private的方法照 ...

  5. 输出cglib以及jdk动态代理产生的class文件

      --该设置用于输出jdk动态代理产生的类 System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles&q ...

  6. CGlib和JDK动态代理

    一.CGlib动态代理     JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的1:字节码技术,其原理是通过字节 ...

  7. spring cglib 与 jdk 动态代理

    1. 概述 JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理 Cglib动态代理是 利用asm开源包 把被代理类的clas ...

  8. java学习笔记(中级篇)—JDK动态代理

    一.什么是代理模式 相信大家都知道代理商这个概念,在商业中,代理商无处不在.假设你要去买东西,你不可能去找真正的厂家去买,也不可能直接跟厂家提出需求,代理商就是这中间的一桥梁,连接买家和厂商.你要买或 ...

  9. 有点深度的聊聊JDK动态代理

    在接触SpringAOP的时候,大家一定会被这神奇的功能所折服,想知道其中的奥秘,底层到底是如何实现的.于是,大家会通过搜索引擎,知道了一个陌生的名词:动态代理,慢慢的又知道了动态代理有多种实现方式, ...

  10. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...

随机推荐

  1. 接口拿到的id和传到后台的id不一致,导致查询详情和编辑报错

    碰到这个问题真是百思不得其解.接口上打印的值和数据库一致,浏览器查看response的反馈也一致.但是一在页面打印请求回来的值,就变了,变成了另一个id,但是其他数据又和数据库一致. 查了一圈也没有查 ...

  2. P1982 [NOIP2013 普及组] 小朋友的数字 题解

    目录 简单版 题目 code 本题 code 简单版 先要会做这道题 题目 P1115 最大子段和https://www.luogu.com.cn/problem/P1115 这道题其实是动态规划,d ...

  3. 三种方式实现RPC调用

    一:RabbitMQ实现RPC调用 客户端: import pika import uuid class FibonacciRpcClient(object): def __init__(self): ...

  4. js apply 与 call

    简介 用来调用方法,第一个参数替换掉用方法的this对象 区别:call:A.fn.call(B, arg1,arg2,argn...),后面的参数用逗号分隔 apply:A.fn.apply(B, ...

  5. Linux系统安装&VMware安装二

    第八步: 完成后,选择刚刚创建好的系统

  6. 20192305 王梓全Python程序设计实验三报告

    20192305 王梓全Python程序设计实验三报告 课程:<Python程序设计> 班级: 1923 姓名: 王梓全 学号:20192305 实验教师:王志强 实验日期:2021年5月 ...

  7. 127. Word Ladder via java

    A classic BFS problem, that is, we use a Queue to store temporary solution and record the size of th ...

  8. json字符串让里面的""和null不显示出来

    工具类 ------------------------------------------------------------------------------------------------ ...

  9. mysql之字段约束-第五篇

    数据库的完整性约束是为了在数据库应用中保证数据的一致性和正确性.所以在创建数据表时定义其字段的约束是非常有必要的. 主键约束 主键(primary key)是一个列或者列的组合,其值能唯一地标识表中的 ...

  10. 【JavaScript】JS写法随笔(二) JS动态生成表格

    主要思路:通过Ajax请求后端接口并拿到结果list之后,然后通过DOM获取tbody并向tbody中添加行.单元格. $("#calculate").click(function ...