1. 程式人生 > >Spring中常用的設計模式:代理模式

Spring中常用的設計模式:代理模式

文章目錄

代理模式

本質:控制物件訪問

代理模式具有可擴充套件性:

  • 中介隔離作用。
  • 開閉原則,增加功能。

靜態代理

靜態代理是由我們自己建立或特定工具自動生成原始碼,在對其編譯。在程式設計師執行之前,代理類.class檔案就已經被建立了。

  • 缺點:我們得為每一個服務都得建立代理類,工作量太大,不易管理。同時介面一旦發生改變,代理類也得相應修改。

動態代理

動態代理是在程式執行時通過反射機制動態建立的。在動態代理中我們不再需要再手動的建立代理類,只需要編寫一個動態處理器就可以了。真正的代理物件由JDK再執行時為我們動態的來建立。

Spring AOP的代理模式

Spring AOP的底層是通過動態代理技術在執行期為目標Bean織入增強的程式碼

Spring使用了兩種代理機制:

  • 基於JDK的動態代理:
    通過介面來實現方法攔截,必須確保要攔截的目標方法在介面中有定義,否則將無法實現攔截。
  • 基於CGLib的動態代理
    通過生成代理子類來實現方法攔截,必須確保要攔截的目標方法可被子類訪問,也就是目標方法必須定義為非final,則非私有例項方法。
  • 兩種代理機制的對比:
    CGLib所建立的動態代理物件的效能比JDK所建立的動態代理效能高(大概10倍)。但CGLib在建立代理物件時所花費的時間卻比JDK動態代理多(大概8倍)。
  • 各自的使用場景:
    對於singleton的代理物件或者具有例項池的代理,因為無須頻繁建立代理物件,所以比較適合採用CGLib動態代理技術;反之則適合採用JDK動態代理技術。