2.3.3 CGLIB動態代理
前面介紹了JDK的動態代理,從一些實例也可以看到,JDK動態代理是依賴於實現的接口的。而CGLIB彌補了這個缺點,讓我們在不需要實現接口的情況下,也可以實現動態代理。JDK動態代理和CGLIB動態代理在Spring實現AOP中都是使用到的技術,Spring AOP默認是使用JDK動態代理來代理接口的,但是可以進行強制使用CGLIB動態代理。
CGLIB內部使用了ASM(Java字節碼操控框架)來進行轉換字節碼。可以代理沒有接口類的類。所以相比較JDK動態代理來說,靈活一些,更值得稱讚的地方是,由於CGLIB第通過字節碼產生子類進行覆蓋委託類的非final方法進行代理,而JDK動態代理使用Java類反射進行代理,所以CGLIB動態代理比JDK動態代理更快。注意,CGLIB不能對final和私有方法進行代理。
實例演示。首先創建一個委託類(目標類)。
代碼清單2-25:AliPay目標類
public class AliPay {
public void pay(String operation) {
System.out.println("進行AliPay支付,操作:" + operation);
}
}
可以看到,在這裡我們不再實現Pay接口了。
接下來我們需要引入一個依賴。在pom.xml文件中增加如下代碼。不使用該包下的,使用org.springframework.cglib.proxy下的MethodInterceptor 類也是可以的。
代碼清單2-26:pom.xml文件增加如下代碼
<dependencies>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
</dependencies>
接下來就是直接寫CGLIB的代理類。
更多內容請閱讀原文:
https://chenhx.blog.csdn.net/article/details/108027551