<noframes id="ndrzl"><form id="ndrzl"><nobr id="ndrzl"></nobr></form>

<sub id="ndrzl"><listing id="ndrzl"><listing id="ndrzl"></listing></listing></sub><noframes id="ndrzl">

<address id="ndrzl"><nobr id="ndrzl"><progress id="ndrzl"></progress></nobr></address>
<address id="ndrzl"><form id="ndrzl"></form></address>

<listing id="ndrzl"></listing>

<noframes id="ndrzl">

    <address id="ndrzl"></address>
    專注Java教育13年 全國咨詢/投訴熱線:400-8080-105
    動力節點LOGO圖
    始于2009,一家只教授Java的培訓機構
    首頁 hot資訊 代理模式的應用場景

    代理模式的應用場景

    更新時間:2022-11-23 08:10:15 來源:動力節點 瀏覽44次

    代理模式的應用場景有哪些?動力節點小編來告訴大家。

    1.日志的采集

    2.權限控制

    3.實現aop

    4.Mybatis mapper

    5.Spring事務管理

    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字節碼技術,生成子類實現對目標方法實現增強

    Jdk與Cglib動態代理的區別

    1.Jdk動態代理利用反射技術生成匿名的代理類走InvokeHandler回調方法實現增強,同時也是一種基于接口的方式實現代理。

    2.Cglib動態代理利用asm字節碼技術生成一個子類覆蓋其中的方法實現增強

    3.在Spring中如果需要被代理的對象如果實現了接口采用Jdk動態代理,沒有實現接口則使用Cglib動態代理。

    提交申請后,顧問老師會電話與您溝通安排學習

    免費課程推薦 >>
    技術文檔推薦 >>
    返回頂部
    av无码天堂热久久
    <noframes id="ndrzl"><form id="ndrzl"><nobr id="ndrzl"></nobr></form>

    <sub id="ndrzl"><listing id="ndrzl"><listing id="ndrzl"></listing></listing></sub><noframes id="ndrzl">

    <address id="ndrzl"><nobr id="ndrzl"><progress id="ndrzl"></progress></nobr></address>
    <address id="ndrzl"><form id="ndrzl"></form></address>

    <listing id="ndrzl"></listing>

    <noframes id="ndrzl">

      <address id="ndrzl"></address>