动态代理模式示例-接上文
来源:互联网 发布:lv男士名片夹 淘宝 编辑:程序博客网 时间:2024/05/21 06:46
引言
上文中我们实现了静态代理设计,但是静态代理有一个很严重的问题,如果一个工程中有很多的表和DAO类,那么一个静态代理只能代理一个DAO程序,这样我们就必须为每个DAO实现一个静态代理操作,非常麻烦。有什么办法能让一个代理类动态的代理一系列的DAO类?这样动态代理孕育而生。
动态代理类的实现
这样,我们在上文中的环境下,创建一个动态代理对象 DynamicProxy,注意动态代理对象需要继承自InvocationHandler对象:
package com.StaticProxy.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import com.StaticProxy.DAO.IUserDAO;import com.StaticProxy.DAO.UserDAO;/* * 动态代理 */public class DynamicProxy implements InvocationHandler{private Object target; //要代理的对象信息public Object Bind(Object target){this.target = target;//返回与当前传入对象结构相同的代理类对象return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {this.log(method.getName());//取得当前执行的方法名称Object retObj = method.invoke(this.target,args);//如果是do开头的操作,则加上事务if(method.getName().matches("do[a-zA-Z0-9]+")){this.commit();}return retObj;}//增加log记录private void log(String name) {System.out.println("操作:" + name + " 日志记录");}//commit事务处理private void commit() {System.out.println("commit事务提交");}}
测试结果
这样我们简单的写一个main函数对上述动态代理进行测试:public static void main(String[] args) {IUserDAO dao = (IUserDAO) new DynamicProxy().Bind(new UserDAO());dao.doCreate(null);dao.findAll();}我们的动态代理类是针对do开头的操作,带上事务信息。所有的操作,都切入log日志保存功能。执行结果如下:
我们可以看到,对于第一个测试操作,dao.doCreate()返回log日志记录和commit事务提交,而第二个非do开头的查询操作,只返回log日志记录。而且这个动态代理对象可以代理所有的类。这样我们以后能很好的理解Spring框架中的面向切面编程。
0 0
- 动态代理模式示例-接上文
- 设计模式之代理模式------动态代理(示例说明)
- java动态代理设计模式简单示例
- 代理模式--动态代理
- 代理模式 & 动态代理
- 代理模式--动态代理
- 代理模式(动态代理)
- 代理模式-动态代理
- 代理模式-动态代理
- 代理模式动态代理
- 代理模式-动态代理
- 代理模式 -动态代理
- 代理模式---动态代理
- 代理模式-动态代理
- Java 动态代理示例
- 动态代理示例
- 动态代理,示例
- JDK动态代理示例
- 编译时替换资源 - Android重叠包与资源合并一见
- StackOverflow-人气(Reputation)
- eclipse中.java文件和.html文件怎么不同编码方式
- leetcode--Factorial Trailing Zeroes
- 通过浏览器渲染过程来进行前端优化
- 动态代理模式示例-接上文
- Makefile学习笔记(二)
- java定时器 schedule和scheduleAtFixedRate区别(转)
- php 获取变量的整数值 intval()
- java使用validator进行校验
- 二叉搜索树与双向链表
- Matlab 的基本结构
- filebeat-5.1.1配置详解
- AndroidStudio坑爹错误之一