隨筆-95  評論-31  文章-10  trackbacks-0
          代理模式(靜態): 一個接口,兩個實現類A(代理類)和B(業務類),A類持有B類,這兩個類方法相同,那么A類方法內部調用B類的方法,就可以在B類核心業務前后進行前置處理、后置處理,異常環繞處理等等。

          Jdk動態代理要求必須有接口I和實現類B(業務類),那么通過jdk動態代理生成的類就是類A(代理類),上面代理模式是靜態代理,這里就是動態代理,代碼運行時候會生成一個代理類。
          Cglib動態代理不要求有接口I只需要一個核心業務類B,那么通過cglib動態代理生成的類就是類A(代理類), 同上。

          JDK動態代理示例:
          public static void main(String[] args) {    
                  
          //核心業務類B
                  IBooService B = new BooServiceImpl();
                  
          //生成的代理類A
                  Object A = Proxy.newProxyInstance(IBooService.class.getClassLoader(), new Class[]{IBooService.class}, new InvocationHandler() {
                      @Override
                      
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                          
          //代理類方法的通用處理邏輯
                          System.out.println("開始事物");
                          
          //調用核心業務類B的方法
                          ReflectionUtils.invokeMethod(method, B, args);    
                          System.out.println(
          "提交事物");
                          
          return method.getName();
                      }
                  });
                  
          //調用代理類A方法
                  IBooService bs = (IBooService)A;
                  bs.check();
              }
          輸出結果:
          開始事物
          2018-08-16 10:30:44.161 [main] INFO  com.tx.test.service.impl.BooServiceImpl - check()
          提交事物

          Cglib動態代理示例:
          Enhancer enhancer = new Enhancer();
                  
          //設置業務類B
                  enhancer.setSuperclass(FooServiceImpl.class);
                  
          //設置回調
                  enhancer.setCallback(new MethodInterceptor() {
                      @Override
                      
          public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                          Long bTime 
          = System.currentTimeMillis();
                          System.out.println(
          "開始毫秒:"+ bTime);
                          
          //調用業務類B方法
                          proxy.invokeSuper(object, args);
                          Long eTime 
          = System.currentTimeMillis();
                          System.out.println(
          "結束毫秒:"+ bTime);
                          Long mills 
          = eTime - bTime;
                          System.out.println(
          "毫秒:"+ mills);
                          
          return mills;
                      }
                  });
                  
          //生成代理類A
                  Object A = enhancer.create();
                  IFooService fs1 
          = (FooServiceImpl) A;
                  
          //調用代理A方法
                  fs1.check();
          運行結果:
          開始毫秒:1534387476396
          2018-08-16 10:44:36.403 [main] INFO  com.tx.test.service.impl.FooServiceImpl - check()
          結束毫秒:
          1534387476396
          毫秒:
          7
          完!
          posted on 2018-08-16 10:46 朔望魔刃 閱讀(201) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 崇信县| 高阳县| 垣曲县| 丹巴县| 马龙县| 呼图壁县| 柏乡县| 高清| 航空| 叶城县| 云浮市| 友谊县| 南和县| 全州县| 阜平县| 嵩明县| 五常市| 南漳县| 云龙县| 康平县| 肥城市| 腾冲县| 故城县| 五河县| 贺州市| 泸定县| 安顺市| 晋州市| 安新县| 忻州市| 庄河市| 张家口市| 峡江县| 金湖县| 南靖县| 佛学| 金塔县| 台山市| 鹤岗市| 无极县| 正安县|