標籤:不能被繼承 特殊情況 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代理