spring5.0学习笔记8
动态代理分析
基于接口的动态代理
package com.test2;public interface IProducer{public void saleProduct(float money);public void afterSalesService(float money);
}package com.test2;/**生产厂家** @author Administrator**/
public class Producer implements IProducer{@Overridepublic void saleProduct(float money){System.out.println("卖出产品,得到"+money);}@Overridepublic void afterSalesService(float money){System.out.println("售后服务,得到"+money);}
}
package com.test2;/**生产厂家** @author Administrator**/
public class Producer implements IProducer{@Overridepublic void saleProduct(float money){System.out.println("卖出产品,得到"+money);}@Overridepublic void afterSalesService(float money){System.out.println("售后服务,得到"+money);}
}
package com.test2;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;/*** 模拟一个客户* @author Administrator**/
public class Client {public static void main(String[] args) {final Producer producer = new Producer();
// producer.saleProduct(10000f);/*** 动态代理的特点,字节码随用随创建,随用随加载* 作用是不修改源码的基础上,对方法增强* 分为基于接口的动态代理,和基于子类的动态代理* 基于接口的动态代理* 涉及的类 Proxy* 提供者 jdk官方* 如何创建代理对象 使用Proxy 中 的newProxyInstance方法* 创建代理对象的要求:* 被代理类至少实现一个接口* newProxyInstance方法的参数:* ClassLoader* 用于加载代理对象字节码的,写的是被代理对象的类加载器(和被代理对象使用相同的类加载器),固定写法* Class[]字节码数组* 用于让代理对象和被代理对象有相同的方法,固定写法* InvocationHandler* 用于提供增强的方法。通常是写一个实现该接口的匿名实现类,但非必须*/IProducer proxyProducer = (IProducer)Proxy.newProxyInstance
(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(), new InvocationHandler(){/*** invoke方法作用* 被代理对象的任何接口方法都会经过该方法* @param proxy 代理对象的引用* @param method 当前执行的方法* @param ags 当前执行方法所需的参数* @return 和被代理对象方法有相同的返回值* @throws Throwable*/@Overridepublic Object invoke(Object proxy,Method method,Object[] args)throws Throwable{//提供增强的代码Object returnValue = null;//1.获取方法执行的参数Float money = (Float)args[0];//2.判断当前方法是什么方法if("saleProduct".equals(method.getName())){returnValue = method.invoke(producer,money*0.8f);}return returnValue;}});proxyProducer.saleProduct(10000f);}}
卖出产品,得到8000.0
基于子类的动态代理
涉及的类 Enhancer
提供者 第三方cglib
package com.test2;/**生产厂家** @author Administrator**/
public class Producer implements IProducer{@Overridepublic void saleProduct(float money){System.out.println("卖出产品,得到"+money);}@Overridepublic void afterSalesService(float money){System.out.println("售后服务,得到"+money);}
}
package com.test2;/**生产厂家** @author Administrator**/
public class Producer implements IProducer{@Overridepublic void saleProduct(float money){System.out.println("卖出产品,得到"+money);}@Overridepublic void afterSalesService(float money){System.out.println("售后服务,得到"+money);}
}
package com.test2;import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;/*** 模拟一个客户* @author Administrator**/
public class Client {public static void main(String[] args) {final Producer producer = new Producer();
// producer.saleProduct(10000f);/*** create参数* Class 用于指定被代理对象的字节码* Callback 用于提供增强代码*/Producer cglibProducer = (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor(){/*** @param* @param* @param*/@Overridepublic Object intercept(Object proxy, Method method,
Object[] args, MethodProxy methodProxy) throws Throwable {// TODO Auto-generated method stub
// 提供增强的代码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(10000f);}}
卖出产品,得到8000.0
动态代理的作用是什么呢? 数据库连接池close在关闭的时候不会真正的关闭而是要还回池中,就可以使用动态代理对getThreadConnection的close()方法进行增强
解决全站中文乱码的request方法的增强,对getParameter()方法增强
spring5.0学习笔记8相关推荐
- mysql5.0镜像_Mysql5.0学习笔记(一)
Mysql5.0学习笔记(一) -基本sql语句与支持字符集 1.登录 mysql -h localhost -u root 2.创建用户firstdb(密码firstdb)和数据库,并赋予权限于fi ...
- Zabbx6.0(学习笔记)
Zabbx6.0(学习笔记) 目录导航 Zabbx6.0(学习笔记) 一.为什么 需要监控系统 二.如何选择监控 三.Zabbix概述 四.Zabbix安装哪个版本? Zabbix安装要求 1.硬件 ...
- flink1.12.0学习笔记第2篇-流批一体API
flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...
- CCC3.0学习笔记_认证和隐私保护
CCC3.0学习笔记_Authentication and Privacy Keys 系列文章目录 文章目录 系列文章目录 前言 1. 手机端和车厂服务器端的密钥存储 2. 密钥的产生和使用的说明 3 ...
- TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)
欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...
- 《TP5.0学习笔记---配置篇》
TP5.0学习笔记 TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文 ...
- Tensorflow2.0学习笔记(一)
Tensorflow2.0学习笔记(一)--MNIST入门 文章目录 Tensorflow2.0学习笔记(一)--MNIST入门 前言 一.MNIST是什么? 二.实现步骤及代码 1.引入库 2.下载 ...
- Tensorflow2.0学习笔记(二)
Tensorflow2.0学习笔记(二)--Keras练习 文章目录 Tensorflow2.0学习笔记(二)--Keras练习 前言 二.使用步骤 1.实现步骤及代码 2.下载 Fashion MN ...
- CCC3.0学习笔记_数字密钥数据结构
CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...
- Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲
Tensorflow2.0学习笔记(一)北大曹健老师教学视频1-4讲 返回目录 这个笔记现在是主要根据北京大学曹健老师的视频写的,这个视频超级棒,非常推荐. 第一讲 常用函数的使用(包含了很多琐碎的函 ...
最新文章
- Apache 配置 Basic 认证
- Please move ‘proctime(r_proctime)‘ to the end of the schema.以及rowtime和proctime
- MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken
- RealView MDK在链接时提示空间不够的解决方案总结
- 亚马逊新专利:Alexa可根据用户的语音识别疾病或抑郁
- 计算机网络课程设计个人总结,计算机网络课程设计心得体会.doc
- VC与matlab混合编程
- 推荐 五个单变量时间序列数据集
- 支付宝VS微信,谁在抄袭谁?
- 110道 Redis面试题及答案 (持续更新)
- 应聘新要求:填写恋爱经历?
- Ceres-Solver使用指南
- 数字图像处理--第六章彩色图像处理基础
- Java超详细基础知识
- 卫星天线如何接受CCTV-5nbsp;CCTV-6
- NAS如何进行磁盘碎片整理?
- 100例(p019—p021)
- 解决Visual C++ Redistributable安装找不到vc_runtimeMinimum_x86.msi最简单办法
- App 运营 推广相关
- Unity中Camera参数—Culling Mask详解