您好,登錄后才能下訂單哦!
這篇文章主要介紹“JDK實現動態代理的方式”,在日常操作中,相信很多人在JDK實現動態代理的方式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JDK實現動態代理的方式”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
JDK代理,代理的是接口,那么筆者想一想,既然代理的是接口,那如果沒有實現類怎么辦,能不能代理。答案是可以的,Mybatis就是這樣的。
Mybatis使用JDK動態代理來實現Mapper接口,事先保存好Mapper接口,和接口聲明的方法,返回值,參數類型,然后代理類的方法調用的時候使用MapperMethod這個事先放入方法緩存里的對象來真實調用功能。
筆者極度簡化了一下代碼:
被代理的接口:
public interface Subject2 { String selectById(); }
這個接口可以看成是Mapper接口
代理對象:
public class SubjectProxy2<T> implements InvocationHandler { private Class<T> proxyInterface; //這里可以維護一個緩存,存這個接口的方法抽象的對象 SubjectProxy2(Class<T> proxyInterface){ this.proxyInterface = proxyInterface; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("selectById")){ //String result = (String) method.invoke(proxyInterface,args); //這里可以得到方法抽象對象來調用真的的查詢方法 System.out.println("selectById調用成功"); } return null; } public T getProxy(){ return (T) Proxy.newProxyInstance(proxyInterface.getClassLoader(),new Class[]{proxyInterface},this); } }
這個代理類使用了泛型,說明這個代理類可以代理所有的mapper接口。
那么接下來測試一下:
public class ProxyTest2 { public static void main(String[] args) { SubjectProxy2<Subject2> subjectProxy2 = new SubjectProxy2(Subject2.class); Subject2 subject2 = subjectProxy2.getProxy(); subject2.selectById(); } }
結果不言而喻。肯定會有相應的輸出
沒有看mybatis源碼的時候,我以為動態代理一定要要有實現類才能代理,但是看了優秀的頂級大牛的源碼之后,我才發現,原來還可以這樣。
到此,關于“JDK實現動態代理的方式”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。