用 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. 物料Classification 分类系统

    作用:可以追加物料的属性,因为在物料主界面字段是有限的,并且并不是符合所有企业的业务,可以使用追加属性的方式给物料添加各式各样的属性 1.创建特性,Tcode:CT04 2.创建分类 Tcode:CL ...

  2. SAP BPC全面预算及合并解决方案.pdf 电子版

    SAP BPC全面预算及合并解决方案.pdf 电子版 有需要的联系 wx :erpworld

  3. python 中的 re.compile 函数

    python 中的 re.compile 函数   正则表达式功能十分强大. "有些人面临一个问题时会想:'我知道,可以用正则表达式来解决这个问题.'于是现在他们就有两个问题了"- ...

  4. Ngrinder(性能测试工具)-(一)

    一.ngrinder介绍 nGrinder 是基于Grinder开源项目,由NHN公司的开发团队进行了重新设计和完善. nGrinder 是一款非常易用,有简洁友好的用户界面 和 controller ...

  5. 学生网络创业交流会-2021年office

    1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分. 2.这一步非常的简单,打开下载素材文件,在[文 ...

  6. 【MYSQL】group_concat长度问题分析

    今天在生产环境发现一个ArrayIndexOutOfBounds的问题,经过排查,发现是group_concat拼接的字符串太长,超过了1024,导致报错. 我们可以通过 : SET [SESSION ...

  7. K8S kubectl命令

    一.kubectl命令 1. 格式:kubectl [command] [type] [name] [flag] command:资源执行的操作,如create.get.delete: type:指定 ...

  8. csss线条中间粗两边细

    效果 <div class="hr-line-div"></div> .hr-line-div { margin: 0 auto; height: 2px; ...

  9. Linux 使用ssh服务管理远程主机

    配置网络服务 配置网卡的4种方法: 创建网络会话 RHEL和CentOS系统默认使用NetworkManager来提供网络服务,这是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态.可以使用 ...

  10. Python基础数据类型-Dictionary(字典)

    # -- coding: utf-8 -- # @time : 2022/7/19 21:51 # @file : 10pytest基本数据类型-dic.py # @software: pycharm ...