【轉】spring的AOP動態代理--JDK代理和CGLIB代理

來源:互聯網
上載者:User

標籤:不能被繼承   特殊情況   targe   http   article   --   不能   自己的   ips   

 

原文地址:

http://www.iteye.com/topic/323547

 大家都知道AOP使用了代理模式,本文主要介紹兩個代理模式怎麼設定以及區別,對原文一些內容進行了引用後加入了自己的理解和更深入的闡述:  一、JDK代理和CGLIB代理的底層實現區別
* JDK代理只能 針對實現了介面的類以反射的方式組建代理程式,而不能針對類 ,所以也叫“介面代理”
* CGLIB是 針對類實現代理的,主要對指定的類以位元組碼轉換的方式(ASM架構)產生一個 子類,並重寫其中的方法。 
【注意】:  有兩種特殊情況,static與final方法:    
 

Final方法

Static方法

Jdk代理

介面無法使用final關鍵字,所以不能用。

【報錯】

介面方法使用了static後代理對象將無法訪問此方法,所以不能用。

【報錯】

Cglib代理

父類方法使用了final之後,子類將無法對其進行重寫,無法攔截。

【不報錯,但不攔截】

父類方法使用了static之後,子類將無法對其進行重寫,無法攔截。

【不報錯,但不攔截】

同時,當使用cglib代理的時候,目標類一定不能為final類(不能被繼承),否則報錯。   以上可以看出使用代理的時候,盡量不要使用final和static關鍵字。   二、Spring中兩個模式的調配:
1、如果目標對象 實現了介面,預設會採用JDK的動態代理機制實現AOP,但是可以強制使用CGLIB實現AOP ;
2、如果目標對象 沒有實現介面,必須使用CGLIB組建代理程式,spring會自動在CGLIB和JDK動態代理之間切換 。

3. 如何強制使用CGLIB組建代理程式? 
* 添加CGLIB庫,<SPRING_HOME>/lib/cglib/*.jar (其實Spring的核心包包括了cglib-nodep-2.2.jar,或者用MyEclipse構建項目也會自動引入) * 在spring的設定檔中加入: 
<aop:aspectj-autoproxy proxy-target-class="true"/> 

 

 

【轉】spring的AOP動態代理--JDK代理和CGLIB代理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.