A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 血剑无痕 中级黑马   /  2013-10-29 13:09  /  570 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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;
    }
   
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马