<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        IT忍者神龜之Java動態代理與CGLib代理

        來源:懂視網 責編:小采 時間:2020-11-09 14:19:00
        文檔

        IT忍者神龜之Java動態代理與CGLib代理

        IT忍者神龜之Java動態代理與CGLib代理:brpublic class UserDAOImpl{ brbr public void save() { br // TODO Auto-generated method stub br System.out.println(user saved); br } br} br//相關配置,省略了一些不相關內容 brbean id=userDAO class=UserDAOImpl brbean id=userDAOProxy class=org. public class
        推薦度:
        導讀IT忍者神龜之Java動態代理與CGLib代理:brpublic class UserDAOImpl{ brbr public void save() { br // TODO Auto-generated method stub br System.out.println(user saved); br } br} br//相關配置,省略了一些不相關內容 brbean id=userDAO class=UserDAOImpl brbean id=userDAOProxy class=org. public class

        brpublic class UserDAOImpl{ brbr public void save() { br // TODO Auto-generated method stub br System.out.println(user saved); br } br} br//相關配置,省略了一些不相關內容 brbean id=userDAO class=UserDAOImpl brbean id=userDAOProxy class=org.


        public class UserDAOImpl{

        public void save() {

        // TODO Auto-generated method stub

        System.out.println("user saved");

        }

        }

        //相關配置,省略了一些不相關內容











        測試代碼

        ApplicationContext ctx =

        new FileSystemXmlApplicationContext("applicationContext.xml");

        UserDAOImpl userDAOImpl =

        (UserDAOImpl)ctx.getBean("userDAOProxy");

        userDAOImpl.save();

        上面這種情況下程序可以正常運行,但是如果UserDAOImpl實現了一個接口,其他不變

        public class UserDAOImpl implements UserDAO {



        public void save() {

        // TODO Auto-generated method stub

        System.out.println("user saved");

        }



        }

        這種情況下,程序將不能正常運行,會拋出java.lang.ClassCastException異常

        理解上面這種情況產生的原因需要了解Spring AOP的實現原理。
        Spring 實現AOP是依賴JDK動態代理和CGLIB代理實現的。
        以下是JDK動態代理和CGLIB代理簡單介紹
        JDK動態代理:其代理對象必須是某個接口的實現,它是通過在運行期間創建一個接口的實現類來完成對目標對象的代理。
        CGLIB代理:實現原理類似于JDK動態代理,只是它在運行期間生成的代理對象是針對目標類擴展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的java字節碼編輯類庫)操作字節碼實現的,性能比JDK強。
        Spring是依靠什么來判斷采用哪種代理策略來生成AOP代理呢?以下代碼就是Spring的判斷邏輯

        advisedSupport.isOptimize()與advisedSupport.isProxyTargetClass()默認返回都是false,所以在默認情況下目標對象有沒有實現接口決定著Spring采取的策略,當然可以設置advisedSupport.isOptimize()或者advisedSupport.isProxyTargetClass()返回為true,這樣無論目標對象有沒有實現接口Spring都會選擇使用CGLIB代理。所以在默認情況下,如果一個目標對象如果實現了接口Spring則會選擇JDK動態代理策略動態的創建一個接口實現類(動態代理類)來代理目標對象,可以通俗的理解這個動態代理類是目標對象的另外一個版本,所以這兩者之間在強制轉換的時候會拋出j ava.lang.ClassCastException。而所以在默認情況下,如果目標對象沒有實現任何接口,Spring會選擇CGLIB代理, 其生成的動態代理對象是目標類的子類。

        以上說的是默認情況下,也可以手動配置一些選項使Spring采用CGLIB代理。

        org.springframework.transaction.interceptor.TransactionProxyFactoryBean是org.springframework.aop.framework. ProxyConfig的子類,所以可以參照ProxyConfig里的一些設置如下所示,將optimize和proxyTargetClass任意一個設置為true都可以強制Spring采用CGLIB代理。

        //相關配置,省略了一些不相關內容













        true





        true



        使用CGLIB代理也就不會出現前面提到的ClassCastException問題了,

        也可以在性能上有所提高,但是也有它的弊端,Spring doc原文解釋如下optimization will usually mean that advice changes won't take effect after a proxy has been created. For this reason, optimization is disabled by default。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        IT忍者神龜之Java動態代理與CGLib代理

        IT忍者神龜之Java動態代理與CGLib代理:brpublic class UserDAOImpl{ brbr public void save() { br // TODO Auto-generated method stub br System.out.println(user saved); br } br} br//相關配置,省略了一些不相關內容 brbean id=userDAO class=UserDAOImpl brbean id=userDAOProxy class=org. public class
        推薦度:
        標簽: 代理 動態 it
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 999在线视频精品免费播放观看| 亚洲午夜福利在线观看| 噼里啪啦电影在线观看免费高清| 在线不卡免费视频| 国产日韩亚洲大尺度高清| 亚洲成人网在线播放| yellow视频免费看| 亚洲免费二区三区| 亚洲男人av香蕉爽爽爽爽| 亚洲H在线播放在线观看H| 免费网站看av片| 国产又大又长又粗又硬的免费视频 | 亚洲成在人线在线播放无码| 中文在线免费不卡视频| 美女裸身网站免费看免费网站| 亚洲成A人片在线观看无码3D| 久久精品亚洲综合| 视频一区在线免费观看| 亚洲一区二区在线免费观看| 久久久久无码专区亚洲av| 2017亚洲男人天堂一| 人妻无码一区二区三区免费| 亚洲国产成人久久一区久久| a高清免费毛片久久| 日本特黄特黄刺激大片免费| 亚洲国产精品白丝在线观看| 成人毛片免费播放| 亚洲性无码av在线| 国产成人免费高清在线观看| 国产免费一级高清淫曰本片| 免费一级毛片女人图片| 亚洲精品无码不卡在线播放| 久久永久免费人妻精品下载 | 亚洲人成网站色7799| 国产精品免费_区二区三区观看| 人妻巨大乳hd免费看| 国产99视频免费精品是看6| 两个人看的www免费视频中文| 久久亚洲精品无码观看不卡| **实干一级毛片aa免费| 亚洲成人网在线播放|