亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

JDK動態代理

2019-11-11 06:41:47
字體:
來源:轉載
供稿:網友
1、背景   SPRing AOP使用動態代理技術在運行期織入增強的代碼,Spring AOP 的底層使用了兩種代理模式一種是JDK的動態代理,另一種是基于CGLIB的動態代理。之所以需要兩種代理機制,很大程度上是因為JDK本身只提供接口的代理,而不支持類的代理。  2、JDKProxy的代碼package com.itheima.spring.jdkproxy;public interface PersonDao { public void savePerson();}package com.itheima.spring.jdkproxy;public class PersonDaoImpl implements PersonDao{ @Override public void savePerson() { System.out.println("save person"); }}package com.itheima.spring.jdkproxy;public class Transaction { public void beginTransaction(){ System.out.println("begin transcation"); } public void commit() { System.out.println("commit"); }}package com.itheima.spring.jdkproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * 攔截器: * 1、目標類導入進來 * 2、事務導入進來 * 3、invoke完成 * ①開啟事務 * ②調用目標對象的方法 * ③事務提交 * @author xx * */public class MyInterceptor implements InvocationHandler{ private Object target; //目標類 private Transaction transaction;//事務,在這里代表一種功能,但如果要插入多個功能,就不能這么寫了,看下一個案例,可以把他們加入在一個攔截器鏈表里 public MyInterceptor(Object target, Transaction transaction) { super(); this.target = target; this.transaction = transaction; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); if("savePerson".equals(methodName) || "updatePerson".equals(methodName) || "deletePerson".equals(methodName)){ this.transaction.beginTransaction();//開啟 事務 method.invoke(target);//調用目標方法 this.transaction.commit();//事務的提交 }else{ method.invoke(target); } return null; } }package com.itheima.spring.jdkproxy;import java.lang.reflect.Proxy;import org.junit.Test;/** * 1、攔截器的invoke方法是在是什么時候執行的? * 當在客戶端,代理對象調用方法的時候,進入到了攔截器的invoke方法 * 2、代理對象的方法體的內容是什么? * 攔截器的invoke方法的內容就是代理對象的方法的內容 * 3、攔截器中的invoke方法的參數method是誰在什么時候傳遞過來的? * 代理對象調用方法的時候,進入了攔截器中的invoke方法,所以invoke * 方法中的參數method就是代理對象調用的方法 * @author xx */public class JDKProxyTest { /** * 1、創建一個目標類 * 2、創建一個事務 * 3、創建一個攔截器 * 4、動態生成一個代理對象 */ @Test public void test() { Object target = new PersonDaoImpl(); Transaction transaction = new Transaction(); MyInterceptor interceptor = new MyInterceptor(target,transaction); /* *1、目標類的加載器 *2、目標類的所有的接口 *3、攔截器 */ PersonDao personDao = (PersonDao) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), interceptor); personDao.savePerson(); }}思考動態代理是怎么生成的?
 jdk的動態代理不用寫代理方法,它是由java虛擬機實現的,因為JDK生成的最終真正的代理類,它繼承自Proxy并實現了我們定義的PersonDao接口,在實現PersonDao接口方法的內部,通過反射調用了InvocationHandlerImpl的invoke方法。
jdk動態代理比靜態代理先進(不同)在哪?有什么優勢?
①解決代碼重用的問題
②解耦,代碼靈活性高,調用目標代碼時,會在方法“運行時”動態的加入
以上的JdkProxy代碼有什么缺點?
①攔截器中除了能調用目標對象的目標方法以外,功能是比較單一,這個例子只能處理事務(見下面代碼)
②攔截器中invoke方法的if語句(切入點)是不靠譜的,因為一旦方法多了要寫很多(可用正則表達式)
3、另一種改進的JDK動態代理模式package com.itheima.spring.jdkproxy;
/** * 給日志、事務等做了一個抽象,而這個抽象就是Interceptor * @author xx * */public interface Interceptor { /* * 除了目標對象的目標方法之外,其他任何的功能,比如事務、日志等都寫在interceptor里面 */ public void interceptor();}package com.itheima.spring.jdkproxy;/** * Spring的實現比這復雜,用的責任鏈模式 * @author xx * */public class Transaction implements Interceptor{ @Override public void interceptor() { System.out.println("transaction"); }}package com.itheima.spring.jdkproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.util.List;/** * 攔截器: * 1、目標類導入進來 * 2、事務導入進來 * 3、invoke完成 * ①開啟事務 * ②調用目標對象的方法 * ③事務提交 * @author xx * */public class MyInterceptor implements InvocationHandler{ private Object target; //目標類 List<Interceptor> interceptors; public MyInterceptor(Object target, List<Interceptor> interceptors) { super(); this.target = target; this.interceptors = interceptors; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); if("savePerson".equals(methodName) || "updatePerson".equals(methodName) || "deletePerson".equals(methodName)){ for(Interceptor interceptor: interceptors){ interceptor.interceptor(); } } method.invoke(target); return null; }} package com.itheima.spring.jdkproxy;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.List;import org.junit.Test;/** * 1、攔截器的invoke方法是在是什么時候執行的? * 當在客戶端,代理對象調用方法的時候,進入到了攔截器的invoke方法 * 2、代理對象的方法體的內容是什么? * 攔截器的invoke方法的內容就是代理對象的方法的內容 * 3、攔截器中的invoke方法的參數method是誰在什么時候傳遞過來的? * 代理對象調用方法的時候,進入了攔截器中的invoke方法,所以invoke * 方法中的參數method就是代理對象調用的方法 * @author xx */public class JDKProxyTest { /** * 1、創建一個目標類 * 2、創建一個事務 * 3、創建一個攔截器 * 4、動態生成一個代理對象 */ @Test public void test() { Object target = new PersonDaoImpl(); Transaction transaction = new Transaction(); List<Interceptor> interceptors = new ArrayList<Interceptor>(); interceptors.add(transaction); MyInterceptor interceptor = new MyInterceptor(target,interceptors); /* *1、目標類的加載器 *2、目標類的所有的接口 *3、攔截器 */ PersonDao personDao = (PersonDao) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), interceptor); personDao.savePerson(); }}思考改進的代碼解決了什么問題?
解決了之前代碼的缺點一的問題

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91色中文字幕| 久久久久久久久国产精品| 亚洲欧美另类中文字幕| 欧美日韩国产一区二区| 日韩成人性视频| 这里只有精品在线观看| 一区二区av在线| 国产日韩欧美中文| 国自产精品手机在线观看视频| 国产美女91呻吟求| 97国产精品久久| 久久久av一区| 98精品在线视频| 在线观看久久久久久| 日韩在线观看免费全集电视剧网站| 日韩精品久久久久久福利| 欧美在线播放视频| 91欧美精品成人综合在线观看| 中文字幕日本欧美| 亚洲区免费影片| 91在线|亚洲| 亚洲精品国精品久久99热| 一区国产精品视频| 国产精品成人国产乱一区| 国内免费久久久久久久久久久| 91精品国产91久久久久久| 亚洲国产精品久久久| 日韩高清欧美高清| 欧美大全免费观看电视剧大泉洋| 久久好看免费视频| 欧美一区在线直播| 久久久999精品视频| 欧美老少做受xxxx高潮| 亚洲国产精品悠悠久久琪琪| 亚洲一区美女视频在线观看免费| 欧美有码在线观看| 羞羞色国产精品| 欧洲午夜精品久久久| 欧美日韩国产影院| 欧美一区三区三区高中清蜜桃| 国产精品精品久久久久久| 91青草视频久久| 亚洲美女av在线播放| 久久香蕉国产线看观看网| 国产脚交av在线一区二区| 精品视频www| 欧美日韩视频在线| 欧美激情va永久在线播放| 亚洲第一福利视频| 久久精品中文字幕免费mv| 国内精品久久久久久久| 国产一区二区在线免费| 97av视频在线| 久久精品精品电影网| 69久久夜色精品国产69| 亚洲a∨日韩av高清在线观看| 日韩日本欧美亚洲| 国内精品久久久久久久| 久久影视免费观看| 日韩精品中文字幕在线| 欧美成人中文字幕在线| 九九热最新视频//这里只有精品| 国产综合在线视频| 亚洲а∨天堂久久精品9966| 色综合色综合网色综合| 色婷婷综合久久久久| 欧美色播在线播放| 国产精品亚洲精品| 国产婷婷成人久久av免费高清| 91亚洲精品一区| 亚洲激情久久久| 色哟哟网站入口亚洲精品| 亚洲精品黄网在线观看| 在线看日韩av| 亚洲老头老太hd| 欧美激情2020午夜免费观看| 亚洲乱码国产乱码精品精| 国产精品96久久久久久| 日韩欧美在线免费| 亚洲国产成人精品久久久国产成人一区| 久久免费视频这里只有精品| 日韩中文在线中文网三级| 91香蕉嫩草神马影院在线观看| 久久久久www| 久久伊人免费视频| 不卡av在线网站| 欧美激情一区二区三区久久久| 欧美激情小视频| 欧美性感美女h网站在线观看免费| 国产日韩欧美在线| 亚洲va男人天堂| 国产成人av在线| 久久天天躁狠狠躁夜夜爽蜜月| 欧美猛交ⅹxxx乱大交视频| 国产日本欧美视频| 亚洲天堂免费在线| 最近2019年中文视频免费在线观看| 成人自拍性视频| 国产主播欧美精品| 国产精品视频白浆免费视频| 亚洲欧美日韩直播| 国产精品免费久久久久影院| 亚洲一区中文字幕在线观看| 视频在线观看99| 亚洲欧美日本伦理| 亚洲精品久久久久国产| 欧美日韩亚洲国产一区| 俺去了亚洲欧美日韩| 97色在线视频观看| 国产精品免费久久久久影院| 亚洲精品国产精品国自产观看浪潮| 亚洲成成品网站| 中文字幕亚洲欧美日韩在线不卡| 亚州成人av在线| 久久久久久中文| 国产成人精品视频在线观看| 热久久美女精品天天吊色| 亚洲一区二区在线播放| 久久精品视频在线观看| 亚洲精品久久久久中文字幕欢迎你| 久久精品视频网站| 亚洲国产精品va在线观看黑人| 2019国产精品自在线拍国产不卡| 欧美日韩精品在线视频| 亚洲精品国产成人| 国产美女91呻吟求| 欧美成人午夜免费视在线看片| 不用播放器成人网| 亚洲精品日韩欧美| 国产a∨精品一区二区三区不卡| 国产成+人+综合+亚洲欧美丁香花| 亚洲欧美制服第一页| 亚洲成人性视频| 国产小视频91| 欧美情侣性视频| 欧美韩国理论所午夜片917电影| 日本中文字幕成人| 精品国产91乱高清在线观看| 国产亚洲视频在线观看| 91在线视频精品| 97av在线视频| 日韩在线播放av| 亚洲性日韩精品一区二区| 亚洲欧美日韩国产精品| 日韩最新av在线| 精品一区电影国产| 欧美视频二区36p| 国产精品wwww| 色视频www在线播放国产成人| 欧美主播福利视频| 中文字幕欧美日韩va免费视频| 麻豆国产精品va在线观看不卡| 国产一区二区精品丝袜| 欧美精品免费看| 国产精品情侣自拍| 欧美激情xxxx性bbbb| 亚洲国产一区自拍| 亚洲天堂av在线播放| 国产一区二区三区网站| 97**国产露脸精品国产| 亚洲аv电影天堂网| 亚洲激情在线观看视频免费| 日韩成人小视频| 亚洲欧美综合另类中字|