Java 代理設計模式
阿新 • • 發佈:2020-08-18
為其他物件提供一種代理以控制對這個物件的訪問。代理物件起到中介作用,可去掉功能服務或增加額外的服務
1、靜態代理
代理和被代理物件在代理之前是確定的,他們都實現相同的介面或者繼承相同的抽象類
如何實現:建立一個介面,然後建立被代理的類實現該介面並且實現該介面中的抽象方法。之後再建立一個代理類,同時使其也實現這個介面。在代理類中持有一個被代理物件的引用,而後在代理類方法中呼叫該物件的方法
/**
* 服務介面
*/
public interface Service {
/**
* 服務
*/
void doService(String name);
}
/**
* 服務員
*/
public class Waiter implements Service{
2、動態代理(重點)
2.1、jdk動態代理
利用反射機制在執行時建立代理類,代理物件必須實現某個介面
jdk動態代理具體步驟:
-
通過實現 InvocationHandler 介面建立自己的呼叫處理器;
-
通過為 Proxy 類指定 ClassLoader 物件和一組 interface 來建立動態代理類;
-
通過反射機制獲得動態代理類的建構函式,其唯一引數型別是呼叫處理器介面型別;
-
通過建構函式建立動態代理類例項,構造時呼叫處理器物件作為引數被傳入。
/**
* 服務介面
*/
public interface Service {
/**
* 服務
*/
void doService(String name);
}
/**
* 服務員
*/
public class Waiter implements Service {
/**
* 服務
* @param name
*/
參考資料:https://www.jianshu.com/p/9bcac608c714
2.2、cglib動態代理
通過cglib的動態代理它能夠針對實現沒有介面的目標類,進行動態代理
注意:要手動載入cglib的庫檔案
-
實現原理
-
cglib它會生成目標類的子類實現,因此目標類作為父類注入,並且呼叫父類的方法
-
/**
* 服務員(目標物件)
*/
public class Waiter {
/**
* 服務
*/
public void doService(){
System.out.println("正在服務");
}
}
/**
* 代理目標物件類
*/
public class MyMethodInterceptor implements MethodInterceptor {
參考資料: