麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

CGLib動態(tài)代理

2019-11-11 06:38:04
字體:
供稿:網(wǎng)友
代碼package com.itheima.sPRing.cglibproxy;public class PersonDaoImpl{ public void savePerson() { System.out.println("save person"); }}package com.itheima.spring.cglibproxy;public class Transaction { public void beginTransaction(){ System.out.println("begin transcation"); } public void commit() { System.out.println("commit"); }}package com.itheima.spring.cglibproxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class MyInterceptor implements MethodInterceptor{ private Transaction transaction; private Object target; public MyInterceptor(Object target, Transaction transaction ) { super(); this.transaction = transaction; this.target = target; } public Object createProxy(){ //代碼增強類 Enhancer enhancer = new Enhancer(); enhancer.setCallback(this);//參數(shù)為攔截器 enhancer.setSuperclass(target.getClass());//生成的代理類的父類是目標類 return enhancer.create(); } @Override public Object intercept(Object object, Method method, Object[] arg2, MethodProxy arg3) throws Throwable { this.transaction.beginTransaction(); method.invoke(target); this.transaction.commit(); return null; }}package com.itheima.spring.cglibproxy;import org.junit.Test;/** * 通過cglib產(chǎn)生的是代理對象,代理類是目標類的子類 * @author xx * */public class CGLibProxyTest { @Test public void testCGlib(){ Object target = new PersonDaoImpl(); Transaction transaction = new Transaction(); MyInterceptor interceptor = new MyInterceptor(target,transaction); PersonDaoImpl personDaoImpl = (PersonDaoImpl)interceptor.createProxy(); personDaoImpl.savePerson(); }}思考1、JDK動態(tài)代理與CGLib動態(tài)代理的比較?
①Java動態(tài)代理是利用反射機制生成一個實現(xiàn)代理接口的匿名類,在調(diào)用具體方法前調(diào)用InvokeHandler來處理。 而cglib動態(tài)代理是利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節(jié)碼生成子類來處理。
②JDK動態(tài)代理只能對實現(xiàn)了接口的類生成代理,CGLIB是針對類實現(xiàn)代理,主要是對指定的類生成一個子類,覆蓋其中的方法 因為是繼承,所以該類或方法最好不要聲明成final
③JDK代理是不需要以來第三方的庫,只要要JDK環(huán)境就可以,而cglib需要第三方j(luò)ar包
④CGLib創(chuàng)建的動態(tài)代理對象性能比JDK創(chuàng)建的動態(tài)代理對象的性能高,但是CGLib在創(chuàng)建代理對象時所花費的時間卻比JDK多得多,所以對于單例的對象,因為無需頻繁創(chuàng)建對象,用CGLib合適,反之,使用JDK方式要更為合適一些。
2、在Spring中何時用到JDK或者CGLib實現(xiàn)的AOP?
①如果目標對象實現(xiàn)了接口,默認情況下會采用JDK的動態(tài)代理實現(xiàn)AOP
②如果目標對象實現(xiàn)了接口,可以強制使用CGLIB實現(xiàn)AOP
③如果目標對象沒有實現(xiàn)了接口,必須采用CGLIB庫,spring會自動在JDK動態(tài)代理和CGLIB之間轉(zhuǎn)換
3、如何通過調(diào)試查看當前用到的是JDK還是CGLib?CGLib的標志: JDK的標志:4、如何強制用CGLib實現(xiàn)AOP?
①添加CGLIB庫,SPRING_HOME/cglib/*.jar
②在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
5、cglib的應(yīng)用?
廣泛的被許多AOP的框架使用,例如spring AOP和dynaop。hibernate使用CGLIB來代理單端single-ended(多對一和一對一)關(guān)聯(lián)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 成年人在线视频 | 91久久在线观看 | 精品一区久久久 | 成人男女啪啪免费观看网站四虎 | 国产精品久久久不卡 | 久久久久久久久久久一区 | 精品黑人一区二区三区国语馆 | 美国黄色毛片女人性生活片 | 久久久久久久久国产 | 天天草天天干天天 | 免费黄色大片在线观看 | 色污视频在线观看 | 亚洲人成中文字幕在线观看 | 欧洲a级片 | 精品国产91久久久久久久妲己 | 久久精品视频在线 | 深夜福利视频绿巨人视频在线观看 | 久久亚洲视频网 | 国产伦精品一区二区三区 | 亚洲精品午夜电影 | 成片免费观看大全 | 中文字幕欧美视频 | 国产高潮国产高潮久久久91 | 欧美乱论 | 一级大片久久 | 91亚洲精品一区二区福利 | 牛牛视频在线 | 精品一区二区三区免费 | 国产精品久久久久久久hd | 午夜视频中文字幕 | 欧美人与zoxxxx另类9 | 国内性爱视频 | 热99在线视频 | 国产88久久久国产精品免费二区 | 亚洲成人中文字幕在线 | 性插视频 | 日本特级a一片免费观看 | 亚州综合一区 | 欧美特级一级毛片 | 免费在线观看成年人视频 | 国产精品自拍99 |