更新時間:2022-11-23 08:10:15 來源:動力節點 瀏覽44次
代理模式的應用場景有哪些?動力節點小編來告訴大家。
1.日志的采集
2.權限控制
3.實現aop
4.Mybatis mapper
6.全局捕獲異常
7.Rpc遠程調用接口
8.分布式事務原理代理數據源
代理模式主要包含三個角色,即抽象主題角色(Subject)、委托類角色(被代理角色,Proxied)以及代理類角色(Proxy),如上圖所示:
抽象主題角色:可以是接口,也可以是抽象類;
委托類角色:真實主題角色,業務邏輯的具體執行者;
代理類角色:內部含有對真實對象RealSubject的引用,負責對真實主題角色的調用,并在真實主題角色處理前后做預處理和后處理。
靜態代理
靜態代理需要自己人工編寫代理類代碼
基于接口實現方式
public class OrderServiceProxy implements OrderService{
private OrderService orderService;
public OrderServiceProxy(OrderService orderService) {
this.orderService = orderService;
}
public String addOrder(String userName, String userPwd) {
System.out.println("使用靜態代理類打印日志開始:userName:" + userName + "," + userPwd);
String result = orderService.addOrder(userName, userPwd);
System.out.println("使用靜態代理類打印日志結束:userName:" + userName + "," + userPwd);
return result;
}
}
public interface OrderService {
/**
* 需要被代理的方法
* @return
*/
String addOrder(String userName,String userPwd);
}
public class Test001 {
public static void main(String[] args) {
OrderService orderService = new OrderServiceProxy(new OrderServiceImpl());
orderService.addOrder("mayikt","123456");
}
}
基于繼承的實現方式
public class OrderServiceProxy extends OrderServiceImpl {
private OrderService orderService;
public OrderServiceProxy(OrderService orderService) {
this.orderService = orderService;
}
public String addOrder(String userName, String userPwd) {
System.out.println("使用靜態代理類打印日志開始:userName:" + userName + "," + userPwd);
String result = super.addOrder(userName, userPwd);
System.out.println("使用靜態代理類打印日志結束:userName:" + userName + "," + userPwd);
return result;
}
}
動態代理不需要寫代理類對象,通過程序自動生成,而靜態代理需要我們自己寫代理類對象。
Jdk動態代理動態代理
動態代理是在實現階段不用關心代理類,而在運行階段才指定哪一個對象。
動態代理類的源碼是在程序運行期間由JVM根據反射等機制動態的生成 。
JDK動態代理的一般步驟如下:
1.創建被代理的接口和類;
2.實現InvocationHandler接口,對目標接口中聲明的所有方法進行統一處理;
3.調用Proxy的靜態方法,創建代理類并生成相應的代理對象;
實現原理:利用攔截器機制必須實現InvocationHandler接口中的invoke方法實現對
我們的目標方法增強。
CGLIB動態代理
利用asm字節碼技術,生成子類實現對目標方法實現增強
1.Jdk動態代理利用反射技術生成匿名的代理類走InvokeHandler回調方法實現增強,同時也是一種基于接口的方式實現代理。
2.Cglib動態代理利用asm字節碼技術生成一個子類覆蓋其中的方法實現增強
3.在Spring中如果需要被代理的對象如果實現了接口采用Jdk動態代理,沒有實現接口則使用Cglib動態代理。
提交申請后,顧問老師會電話與您溝通安排學習