上节,我们提到了基于接口的动态代理。
基于接口的动态代理
来完成通过中间代理商,消费者从生产商那里购买产品的功能。

这种动态代理要求第三方jar包的支持。
cglib依赖,版本是2.1_3

基于子类的动态代理

涉及的类:Enhancer
提供者:第三方cglib库
如何创建代理对象
使用Enhancer类中的create方法
创建代理对象的要求
被代理类不能是最终类(最终类无法创建子类)
create方法的参数

  • Class:字节码:它是用于指定被代理对象的字节码
  • Callback:用于提供增强的代码

它是让我们写如何代理,我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,它不是必须的
我们一般写的都是该接口的子接口实现类:MethodIntercepter(方法拦截)、他是callback的子接口

//模拟一个消费者
public class Client {public static void main(String[] args) {//找生产商购买产品。final Producer producer = new Producer();//producer.saleProduct(1000);Producer cglibProducer= (Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {/** 执行被代理对象的任何方法都会经过该方法* proxy* method* args* 以上三个参数和基于接口的动态代理中invoke方法的参数是一样。* methodProxy:当前执行方法的代理对象** */public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {//参数1:谁的方法,肯定是被代理对象的方法,当匿名内部类访问外部成员时,要求外部成员时最终的,参数2,要传入的参数//提供增强的代码Object returnValue=null;//1.获取方法执行的参数Float money=(Float)args[0];//2.判断当前方法是不是销售if("saleProduct".equals(method.getName())){returnValue= method.invoke(producer,money*0.8f);}return returnValue;}});cglibProducer.saleProduct(12000f);}
}

它有一个共同的特点,可以对我们已有的方法进行增强,并且在增强的过程中,可以提供一些我们需要实现的功能。
动态代理的作用
1.连接池:close方法在关闭的时候,不能真正的关闭,而是还回池中,我们可以用动态代理的方式,对connection的close方法进行增强,把他加回到池中去
2.解决全栈中文乱码的request对象的方法增强,我们用装饰者模式实现,用动态代理同样可以实现这样的功能。对getParameter方法进行增强。

Spring框架----基于子类的动态代理相关推荐

  1. Spring框架----基于接口的动态代理

    由我们前面对代理的分析 对代理的分析 有生产商,销售人员和消费者这3个角色,销售人员是中间代理商.代理销售和售后的工作. 而在刚开始的时候,我们并没有销售人员.根据这样的思路,我们写出以下代码 接口I ...

  2. 基于子类的动态代理:

    基于子类的动态代理: 提供者:第三方的CGLib,如果报asmxxxx异常,需要导入asm.jar. <dependency> <groupId>cglib</group ...

  3. 基于子类的动态代理(使用CBl工具)

    基于子类的动态代理 要求:                  1.被代理类不能是最终类,不能被finaly修饰                     提供者:第三方 CGlib           ...

  4. 学习spring必须java基础知识-动态代理

    2019独角兽企业重金招聘Python工程师标准>>> Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Jav ...

  5. Spring AOP的两种动态代理方式的原理和实现(JDK和CGLIB)

    代理机制 Spring 的AOP 部分使用使用JDK动态代理,部分使用CGLIB来为目标对象创建代理.如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理:如果目标对象没有实现任何接口,则会 ...

  6. 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算

    Tornado框架-基于正则的动态路由映射分页数据获取计算 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", inde ...

  7. 第六篇 - 手写基于接口实现动态代理

    Github源码下载地址:https://github.com/chenxingxing6/sourcecode/tree/master/code-proxy 一.前言 我们知道常见的动态代理有两种实 ...

  8. Spring AOP的作用,动态代理模式

    AOP即面向切面编程.AOP是基于代理模式的. 代理模式: 当我们需要修改一个类,在类中加入代码时,为了不破坏这个类的封装性.可以使用代理模式,建立一个代理类. 比如:修改需求,在调用UserCont ...

  9. spring框架aop_使用Spring框架和AOP进行动态路由

    spring框架aop 本文的总体思路是展示业务交易如何动态触发业务事件以进行子系统处理. 本文显示的示例有效地使用了Spring框架2.0和Spring AOP来将业务服务与子系统处理功能分离. 现 ...

最新文章

  1. MongoDB学习笔记(一:常见问题汇总)
  2. php重载,PHP重载基础知识回顾
  3. java的poi导出Excel文件
  4. C++定义隐式转换函数,将类转换为内部的一个成员变量
  5. 部署redis主从复制
  6. java图书商城项目介绍_JavaWeb网上图书商城完整项目--11.项目所需jquery函数介绍...
  7. Jquery插件的编写和使用
  8. 数学之美 与 浪潮之巅
  9. 今天终于完成对postfix配置的修改
  10. JS中比較2个字符串内元素的不同(字符1, 字符2, 分隔符可选)
  11. Python 3. Python pyqt5 opencv 摄像头软件 相机 软件 有录像保存视频,保存图片,识别人脸位置功能
  12. windows计算机锁屏的快捷键是什么,win10电脑锁屏快捷键是什么
  13. 操作系统引导程序顺序
  14. java学习路线(阿里p6)
  15. 手机上PDF怎么编辑?这个办公APP必须装!
  16. 能转PDF格式用的在线软件
  17. \u开头的unicode中的\u被转义\\u的问题处理
  18. 【SAP PO】SAP PO 简介:XI、PI、PO的关系与区别
  19. VC开发程序创建Dump文件
  20. 2022年全球市场硬化疗法总体规模、主要企业、主要地区、产品和应用细分研究报告

热门文章

  1. 辛辛苦苦写100条测试用例,为何只被正经执行的只有50条?
  2. 情人节福利,撩妹神器恋爱话术库它来了~
  3. 浅谈网络通信中的流量整形
  4. 基于TCP协议用多线程实现并发服务器,实现思路、算法和demo
  5. ubuntu10.04添加账户示例
  6. java sql语句怎么调用函数_oracle pl/sql之在java中怎么调用oracle函数
  7. 【Flink】Generic types have been disabled in the ExecutionConfig and type KryoSerializer Row
  8. 【es】使用ElasticSearch的44条建议 性能优化
  9. 【ElasticSearch】Es 源码之 UsageService 源码解读
  10. 【ES】es 冻结的索引如何查询