动态代理学习小案例
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 LQY
13 * @Date 2018/10/15
14 */
15 public class ProxyUtil {
16 /**
17 * 在使用mybatis前提下,獲取操作數(shù)據(jù)庫dao的實(shí)現(xiàn)類的代理對象
18 * @param clazz dao接口的class對象
19 * @return
20 */
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;/*** 回調(diào)處理器* @Author LQY* @Date 2018/10/15*/
public class DaoInvocationhandler implements InvocationHandler{private Object target ;public UserInvocationhandler(Object target){this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object obj = null;SqlSession sqlSession = MyBatisUtil.getSqlSession();try {obj = method.invoke(target,args);//提交事務(wù)
sqlSession.commit();} catch (Exception e) {e.printStackTrace();//回滾事務(wù)
sqlSession.rollback();}finally {//釋放SqlSession
sqlSession.close();}return obj;}
} View Code
代理類可以在運(yùn)行時(shí)創(chuàng)建全新的類 。 這樣的
代理類能夠?qū)崿F(xiàn)指定的接口
。 尤其是 , 它具有下列方法 :
? 指定接口所需要的全部方法 。
? Object
類中的全部方法 , 例如 , toString 、 equals 等
。
然而
, 不能在運(yùn)行時(shí)定義這些方法的新代碼 。 而是要提供一個(gè)調(diào)用處理器 ( invocation
handler ) 。 調(diào)用處理器是實(shí)現(xiàn)了 InvocationHandler 接口的類對象 。 在這個(gè)接口中只有一個(gè)方法 :
Object invoke ( Object proxy , Method method , Object □ args )
無論何時(shí)調(diào)用代理對象的方法
, 調(diào)用處理器的
invoke 方法都會(huì)被調(diào)用 , 并向其傳遞
Method 對象和原始的調(diào)用參數(shù) 。 調(diào)用處理器必須給出處理調(diào)用的方式 。
?
?
要使用上面這個(gè)小工具必須要有這兩個(gè)類。
學(xué)習(xí)動(dòng)態(tài)代理的小案例工具,寫得不好請多多指教!
轉(zhuǎn)載于:https://www.cnblogs.com/nisiweiLIQIYONG/p/9797081.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: 试除法的妙用【O(√N) 复杂度】
- 下一篇: MES系统实施4大关键点,您都知道吗?