黑马程序员技术交流社区

标题: 完成事务的代理类 [打印本页]

作者: 血剑无痕    时间: 2013-10-29 13:09
标题: 完成事务的代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
/**
* 事务的代理类,可以代理任意的Service
*/
public class TxProxy implements InvocationHandler{
    private Object src;         //声明被代理类对象
    private TxProxy(Object src){//在私有的构造中给成员设置值
       this.src=src;
    }
    /**
     * 提供一个静态的方法返回代理对象
     */
    public static Object factory(Object src){
       Object proxyedObj = //生成被代理类的接口的子类
              Proxy.newProxyInstance(
                     TxProxy.class.getClassLoader(),
                     src.getClass().getInterfaces(),
                     new TxProxy(src));
       return proxyedObj;
    }
   
    /**
     * 以下是执行的句柄,当调用代理类的任意方法时都会调用这个方法
     * 在这儿是管理事务的关键
     */
    public Object invoke(Object proxy, Method method, Object[]args)
           throws Throwable {
       //第一步:声明连接
       Connection con = null;
       Object returnValue = null;
       try{
           //第二步:获取连接
           con = DataSourceUtils.getConn();
           //第三步:设置事务的开始
           con.setAutoCommit(false);
           //第四步:调用目标类(被代理类)的方法
           returnValue = method.invoke(src, args);
           //第五步:调用如果成功
           con.commit();
       }catch(Exception e){
           con.rollback();
           throw e;
       }finally{
           con.close();
           DataSourceUtils.remove();
       }
       return returnValue;
    }
   
}






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2