標籤:and 工具 map load handle pen cep 對象 inter
1 package edu.nf.utils; 2 3 import edu.nf.dao.UserDao; 4 import edu.nf.dao.UserInvocationhandler; 5 import org.apache.ibatis.session.SqlSession; 6 7 import java.lang.reflect.InvocationHandler; 8 import java.lang.reflect.Proxy; 9 10 /**11 * 代理工具12 * @Author LQY13 * @Date 2018/10/1514 */15 public class ProxyUtil {16 /**17 * 在使用mybatis前提下,擷取操作資料庫dao的實作類別的代理對象18 * @param clazz dao介面的class對象19 * @return20 */21 public static Object getProxy(Class<?> clazz){22 SqlSession sqlSession = MyBatisUtil.getSqlSession();23 Object dao = sqlSession.getMapper(clazz);24 try {25 InvocationHandler handler = new DaoInvocationhandler(dao);26 return Proxy.newProxyInstance(clazz.getClassLoader(), dao.getClass().getInterfaces(), handler);27 } catch (Exception e) {28 e.printStackTrace();29 }30 return null;31 }32 }
package edu.nf.dao;import edu.nf.utils.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * 回調處理器 * @Author LQY * @Date 2018/10/15 */public class DaoInvocationhandler implements InvocationHandler{ private Object target ; public UserInvocationhandler(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; SqlSession sqlSession = MyBatisUtil.getSqlSession(); try { obj = method.invoke(target,args); //提交事務 sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); //復原事務 sqlSession.rollback(); }finally { //釋放SqlSession sqlSession.close(); } return obj; }}View Code
代理類可以在運行時建立全新的類 。 這樣的
代理類能夠實現指定的介面
。 尤其是 , 它具有下列方法 :
? 指定介面所需要的全部方法 。
? Object
類中的全部方法 , 例如 , toString 、 equals 等
。
然而
, 不能在運行時定義這些方法的新代碼 。 而是要提供一個調用處理器 ( invocation
handler ) 。 調用處理器是實現了 InvocationHandler 介面的類對象 。 在這個介面中只有一個方法 :
Object invoke ( Object proxy , Method method , Object □ args )
無論何時調用代理對象的方法
, 調用處理器的
invoke 方法都會被調用 , 並向其傳遞
Method 對象和原始的調用參數 。 調用處理器必須給出處理調用的方式 。
要使用上面這個小工具必須要有這兩個類。
學習動態代理的小案例工具,寫得不好請多多指教!
動態代理學習小案例