Spring中常用的設計模式:代理模式
阿新 • • 發佈:2018-11-16
文章目錄
代理模式
本質:控制物件訪問
代理模式具有可擴充套件性:
- 中介隔離作用。
- 開閉原則,增加功能。
靜態代理
靜態代理是由我們自己建立或特定工具自動生成原始碼,在對其編譯。在程式設計師執行之前,代理類.class檔案就已經被建立了。
- 缺點:我們得為每一個服務都得建立代理類,工作量太大,不易管理。同時介面一旦發生改變,代理類也得相應修改。
動態代理
動態代理是在程式執行時通過反射機制動態建立的。在動態代理中我們不再需要再手動的建立代理類,只需要編寫一個動態處理器就可以了。真正的代理物件由JDK再執行時為我們動態的來建立。
Spring AOP的代理模式
Spring AOP的底層是通過動態代理技術在執行期為目標Bean織入增強的程式碼。
Spring使用了兩種代理機制:
- 基於JDK的動態代理:
通過介面來實現方法攔截,必須確保要攔截的目標方法在介面中有定義,否則將無法實現攔截。 - 基於CGLib的動態代理
通過生成代理子類來實現方法攔截,必須確保要攔截的目標方法可被子類訪問,也就是目標方法必須定義為非final,則非私有例項方法。 - 兩種代理機制的對比:
CGLib所建立的動態代理物件的效能比JDK所建立的動態代理效能高(大概10倍)。但CGLib在建立代理物件時所花費的時間卻比JDK動態代理多(大概8倍)。 - 各自的使用場景:
對於singleton的代理物件或者具有例項池的代理,因為無須頻繁建立代理物件,所以比較適合採用CGLib動態代理技術;反之則適合採用JDK動態代理技術。