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