package org.fanhongtao.mybatis.frame; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author Fan Hongtao * @created 2010-8-17 */ public class ServiceProxy<T> implements InvocationHandler { private BaseService<T> delegate; public ServiceProxy(BaseService<T> baseService) { this.delegate = baseService; } public BaseService<T> getDelegate() { return delegate; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; if (delegate.isAutoCommit()) { delegate.setSession(MyBatisConfig.getSession()); MyBatisConfig.registerConnection(delegate.getSession().getConnection(), this); try { result = method.invoke(delegate, args); delegate.getSession().commit(); } catch (Exception e) { throw new DbException(e); } finally { delegate.getSession().close(); } } else { try { result = method.invoke(delegate, args); } catch (Exception e) { throw new DbException(e); } } return result; } @SuppressWarnings({ "rawtypes", "unchecked" }) public static <T> T newProxy(Class<T> mapperClass) { ClassLoader classLoader = mapperClass.getClassLoader(); Class[] interfaces = new Class[] { mapperClass }; String mapperClassName = mapperClass.getName(); String serviceClassName = mapperClassName.replaceFirst("iface", "service").replace("Mapper", "Service"); BaseService service = null; try { Class c = classLoader.loadClass(serviceClassName); service = (BaseService) c.newInstance(); } catch (Exception e) { throw new DbException(e); } InvocationHandler handler = new ServiceProxy<T>(service); return (T) Proxy.newProxyInstance(classLoader, interfaces, handler); } }