代理模式实例
时间:2022-07-24
本文章向大家介绍代理模式实例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
静态代理:
public interface PersonDao {
public void savePerson();
}
public class PersonDaoImpl implements PersonDao{
public void savePerson() {
System.out.println("save person");
}
}
public class Transaction {
public void beginTransaction(){
System.out.println("begin transaction");
}
public void commit(){
System.out.println("commit");
}
}
public class PersonDaoProxy implements PersonDao{
private PersonDao personDao;
private Transaction transaction;
public PersonDaoProxy(PersonDao personDao, Transaction transaction) {
super();
this.personDao = personDao;
this.transaction = transaction;
}
public void savePerson() {
this.transaction.beginTransaction();
this.personDao.savePerson();
this.transaction.commit();
}
}
/**
* 静态代理模式的缺点
* 1、只要写一个dao的是实现类就会写一个代理类
* 2、如果接口中的方法比较多,那么代理类中的方法就比较多,每个方法都需要开启事务、事务的提交
* 所以没有简化开发,没有做到业务逻辑与事务的松耦合
* @author zd
*
*/
public class StaticProxyTest {
@Test
public void testProxy(){
PersonDao personDao = new PersonDaoImpl();
Transaction transaction = new Transaction();
PersonDaoProxy proxy = new PersonDaoProxy(personDao, transaction);
proxy.savePerson();
}
}
动态代理:
1.jdk动态代理(接口代理)
public interface PersonDao {
public void savePerson();
public void updatePerson();
}
public class PersonDaoImpl implements PersonDao{
public void savePerson() {
System.out.println("save person");
}
public void updatePerson() {
// TODO Auto-generated method stub
System.out.println("update person");
}
}
public class Transaction {
public void beginTransaction(){
System.out.println("begin transaction");
}
public void commit(){
System.out.println("commit");
}
}
/**
* 1、引入目标类和事务类
* 2、完成invoke
* @author zd
*
*/
public class MyInterceptor implements InvocationHandler{
private Object target;
private Transaction transaction;
public MyInterceptor(Object target, Transaction transaction) {
super();
this.target = target;
this.transaction = transaction;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
this.transaction.beginTransaction();
method.invoke(this.target, args);
this.transaction.commit();
return null;
}
}
/**
* 1、产生的代理类与接口是什么关系?
* 代理类实现了接口
* 2、代理类的方法体的内容是什么?
* 方法体的内容就是拦截器中invoke方法体的内容
* 3、拦截器的作用是什么?
* 完成invoke方法体中的内容
* 4、拦截器中的invoke方法的参数method
* 客户端调用哪个方法,method就代理哪个方法
* 5、拦截器中的invoke方法是什么?
* 是代理类的方法
* @author zd
*
*/
public class JDKProxyTest {
@Test
public void testJDKProxy(){
Object target = new PersonDaoImpl();
Transaction transaction = new Transaction();
MyInterceptor interceptor = new MyInterceptor(target, transaction);
//产生代理对象
/**
* 第一个参数
* 类加载器
* 第二个参数
* 目标类实现的所有的接口
* 第三个参数
* 拦截器
*/
PersonDao personDao = (PersonDao)Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), interceptor);
personDao.updatePerson();
}
}
2.cglib动态代理(子类代理)
public class Transaction {
public void beginTransaction(){
System.out.println("begin transaction");
}
public void commit(){
System.out.println("commit");
}
}
public class PersonDaoImpl{
public void savePerson() {
System.out.println("save person");
}
}
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class PersonDaoInterceptor implements MethodInterceptor{
private Object target;
private Transaction transaction;
public PersonDaoInterceptor(Object target, Transaction transaction) {
super();
this.target = target;
this.transaction = transaction;
}
/**
* 用来产生代理对象
*/
public Object createProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setCallback(this);
//设置代理类的父类
enhancer.setSuperclass(PersonDaoImpl.class);
return enhancer.create();
}
public Object intercept(Object arg0, Method method, Object[] arg2,
MethodProxy arg3) throws Throwable {
this.transaction.beginTransaction();
method.invoke(target, arg2);
this.transaction.commit();
return null;
}
}
/**
* 使用cglib产生的代理类,其代理类是目标类的子类
* @author zd
*
*/
public class PersonDaoTest {
@Test
public void testPersonDaoProxy(){
Object target = new PersonDaoImpl();
Transaction transaction = new Transaction();
PersonDaoInterceptor interceptor = new PersonDaoInterceptor(target, transaction);
PersonDaoImpl daoImpl = (PersonDaoImpl)interceptor.createProxy();
daoImpl.savePerson();
}
}
- Hadoop(七)HDFS容错机制详解
- java一些常用并发工具示例
- 机器人来“抢工作”了,瑞典人为何能淡定处之
- 线性代数01 线性的大脑
- spring cloud 学习(10) - 利用springfox集成swagger
- Hadoop(六)之HDFS的存储原理(运行原理)
- Blockchain Global CEO Sam Lee:以大数据为基础,区块链技术加快决策生成速度
- Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群
- 被解放的姜戈08 远走高飞
- mxnet安装及NDArray初体验
- MySQL(十五)之数据备份中mysqldump详解
- 安卓第十夜 亚当的诞生
- MySQL(十四)之数据备份与还原
- MySQL(十三)之MySQL事务
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 四件简单的事情,帮助改善部署过程
- 为什么 Python 程序中很少看到驼峰式的命名方式?
- GATK的FilterMutectCalls如何才能成功呢
- Python字典按键/值排序的几种方法
- Python 的传参是传值还是传址?
- 什么是猴子补丁?
- 深入理解Python多任务编程----多线程
- Python自省与反射
- Java中String部分源码解析
- Metal入门教程(三)摄像头采集渲染
- Java面试中常考关键字
- Metal入门教程(四)灰度计算
- 最长公共子序列
- 为什么说Java是“write once and run anywhere”的语言?
- B站课程《三阴性乳腺癌表达矩阵探索》笔记之文献解读