1. 程式人生 > >黑馬程式設計師——高新技術——動態代理

黑馬程式設計師——高新技術——動態代理

代理(Proxy)

1.要為已存在的多個具有相同介面的目標類的各個方法增加一些系統功能。

2.編寫一個與目標具有相同介面的代理類,代理類的每個方法呼叫目標類的相同犯法,並在呼叫方法時加上系統功能的程式碼。

3.採用工廠模式和配置檔案的方式管理,不需要修改客戶端程式,在配置檔案中配置是使用目標類,還是代理類,以便切換。


AOP(面向方面的程式設計)

目標使交叉業務模組化,採用將劃面程式碼移動到原始方法的周圍,與直接在方法中編寫切面程式碼的執行效果是一樣的。

動態代理技術

1.要為系統各種介面的類增加代理功能,需要太多代理,不能全是靜態

2.JVM可在執行期間動態生成類的位元組碼,這種動態生成的類被用做代理類,即動態代理類

3.JVM生成的動態類必須實現一個或多個介面,所以,JVM生成的動態類只能用作具有相同介面的目標類的代理

4.CGLIB庫可以動態生成一個類的子類,一個類的子類也可以用作該類的代理,所以如果要為一個沒有實現介面的類生成動態代理類。那麼可以使用CGLIB庫

5.代理類的各個方法中通常出了要呼叫目標的相應方法和對外返回目標返回的的結果外,還可以在代理方法中的如下四個位置上加上系統功能程式碼:

1.呼叫方法之前2.之後3.前後4在處理異常的catch中

例子:

讓JVM建立動態類及例項物件,需要給它提供哪些資訊?

1.生成的類有哪些方法,通過讓其實現哪些介面的方式進行告知

2.產生的類位元組碼必須有一個關聯的類載入器物件。

3.生成的類中的方法的程式碼是怎樣的,也得有我們提供。把我們的程式碼寫在一個約定好的介面物件的方法中,把物件傳給它呼叫我的方法即插入我的程式碼。



構造方法接收一個InvocationHandler物件,是為記住這個物件,然後使用它

呼叫代理涉及三個要素:物件,方法,引數。


切面的程式碼以物件的形式封裝。

給InvocationHandler傳遞兩個物件才能做成框架:目標物件及系統物件。



實現AOP功能的封裝與配置

1.工廠類BeanFactory負責建立目標類或代理類的例項物件,並通過配置檔案實現切換,其getBean方法根據引數字串返回一個相應的例項物件,如果引數字串在配置檔案中隊形的類名不是ProxyFactionBean,直接返回該類的例項物件,否則返回該類例項物件的getProxy方法的返回物件。

2.BeanFactory的構造方法接收代表配置檔案的輸入流物件,配置檔案格式為鍵值對

3.ProxyFactionBean充當封裝生成動態代理的工廠,需要工廠提供哪些引數資訊:目標,通知

4.編寫客戶端應用:

編寫實現Advice介面的類和在配置檔案中進行配置。

呼叫BeanFactory獲取物件