隨筆-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 朔望魔刃 閱讀(209) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 荥阳市| 获嘉县| 汝州市| 射洪县| 息烽县| 南昌市| 宁陕县| 肇源县| 如东县| 郁南县| 余庆县| 泾阳县| 聂拉木县| 台湾省| 噶尔县| 盐边县| 郓城县| 兰西县| 廊坊市| 深州市| 阳东县| 阜南县| 濉溪县| 石嘴山市| 绿春县| 磐安县| 吐鲁番市| 衡阳市| 古浪县| 资阳市| 泊头市| 南漳县| 贡觉县| 张北县| 京山县| 汤阴县| 仁化县| 平果县| 洛浦县| 万盛区| 巴塘县|