java 動態代理。具體有如下四步驟:
- 通過實現 invocationhandler 接口創建自己的調用處理器;
- 通過為 proxy 類指定 classloader 對象和一組 interface 來創建動態代理類;
- 通過反射機制獲得動態代理類的構造函數,其唯一參數類型是調用處理器接口類型;
- 通過構造函數創建動態代理類實例,構造時調用處理器對象作為參數被傳入。
在aop中,spring通過生成代理類,來完成切面的織入。
spring生成代理類有2種方式。
如果目標對象實現的是一個接口,spring會使用jdk的java.lang.relect.proxy類,它允許spring動態生成一個新接口,來實現必要的接口,織入任何通知,并且把對這些接口的任何調用轉發到目標類。
如果目標類沒有實現一個接口,spring就使用cglib庫生成目標類的一個子類,在創建這個子類時,spring織入通知,并且把對這個子類的調用轉發到目標類。在使用這種方式時需要注意一點,被標記為final的方法不能被通知,因為spring創建的子類無法重寫父類的final的方法。
原理區別:
java動態代理是利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用invokehandler來處理。而cglib動態代理是利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理。
- 1、如果目標對象實現了接口,默認情況下會采用jdk的動態代理實現aop
- 2、如果目標對象實現了接口,可以強制使用cglib實現aop
- 3、如果目標對象沒有實現了接口,必須采用cglib庫,spring會自動在jdk動態代理和cglib之間轉換
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/li_canhui/article/details/85253201