动态代理模式示例-接上文

引言

上文中我们实现了静态代理设计,但是静态代理有一个很严重的问题,如果一个工程中有很多的表和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);
	}
	
	@Override
	public 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事务提交");
	}
}


由于使用了 InvocationHandler对象,我们的动态代理类实现非常简单。当然,你也可以不继承这个类,自己使用反射技术手动实现一个动态代理对象。


测试结果

这样我们简单的写一个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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值