CGLIB 與動態代理
CGLIB介紹
Cglib(Byte Code Generation Library )是一個高層次的生成與轉化Java位元組碼的API。之所以稱為高層次是因為它底層採用ASM(位元組碼操作框架)。通過生成動態代理對象與攔截屬性訪問,cglib使用在AOP,測試,數據訪問框架中。
常用的使用框架:Spring ,Hibernate,Mybatis。
CGLIB原理
位元組碼
Cglib是位元組碼生成工具包,位元組碼指Java位元組碼,通常開發Java編寫的為Java源文件,以.java結尾,然後用編譯器編譯成class文件。class文件就是位元組碼文件,可以用編輯器打開,可以看到class文件對應的為二進位文件,它包含的是與平台無關的能被JVM執行的指令格式,所以稱之為位元組碼文件。
JVM能夠讀取所有符合JVM規範的位元組碼。JAVA位元組碼不僅能夠以文件的形式存儲在磁碟上,還可以以網路的方式進行下載,還可以存在內存中。JVM中的類載入器會負責將包含位元組代碼的位元組數組(byte[])中定義出類。在某些時候,可以動態生成Java位元組碼,或者對已有的位元組碼進行修改,在這裡就要提到本文提到的ASM與CGLIB了。CGLIB本質就是封裝了ASM,簡化了ASM的操作,實現了在運行器生成新的位元組碼。
CGLIB結構
CGLIB組成結構
CGLIB實現動態代理
之前的博客寫過採用JDK自帶的代理類實現動態代理,但必須代理類與被代理類必須實現同一介面,這就限制了某些沒有實現介面的類的動態代理功能。採用CGLIB類實現的動態代理無需實現通過介面,下面進行具體介紹。
導入maven包。直接引入cglib-nodep包,這樣就無需導入其他包,直接引入cglib需要依賴其他的包。
定義業務邏輯。
實現MethodInterceptor介面,定義方法的攔截器
驗證
運行結果
總結
基於CGLIB實現的動態代理相比JDK動態代理而言,無侵入型,無需實現介面。基於對位元組碼的修改,生成要代理類的子類,然後再子類中回調代理類的方法。但要注意CGLIB無法代理基於Final或private修飾的方法。
TAG:全球大搜羅 |