posts - 165, comments - 198, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          為我學(xué)習(xí) Spring AOP 準備(Proxy)

          Posted on 2007-10-09 11:13 G_G 閱讀(1118) 評論(2)  編輯  收藏 所屬分類: Spring
          為我準備學(xué)習(xí)和理解spring
          特留下代碼筆記:
          參考:
          http://dev.csdn.net/author/labile/e70c97cb7f504d35b7b5350e7810cc5a.html
          代碼感想:
          ??? 沒個方法都或多或少需要環(huán)境參數(shù)(如: jdbc的conn ,hbn的session...等等 ),方法結(jié)束后又要關(guān)閉。
          何不用proxy代理并用配置文件的方法來 關(guān),開session 等
          如:以下是我的想法并不是實際可用
          ???
          配置:
          <
          class?name="HelloWorldImpl">
          ?
          <function?name="set*" />

          ? <function?name="getName">
          ??? <proxyBegin artt="name" value="liukaiyi"/>
          ??? ??? //使用Proxy來賦值 name那在實現(xiàn)代碼中就可以不用去關(guān)注象 session 等屬性的開關(guān)了
          ??? ??? //proxy中配置下 , 在實現(xiàn)類中 就使用 就可以了

          ??? <proxyBegin?ref="HelloWorldHandler.doBefter"?args="null"/>
          ??? <proxyEnd?ref="HelloWorldHandler.doAfter"?args="null"/>
          ? </function>

          ? <function?=?name="sayHelloWorld">
          ??? <proxyEnd?ref="HelloWorldHandler.doAfter"?args="null"/>
          ? </function>
          </class>

          代碼:
          HelloWorld hw = (HelloWorld)Factory.getBean("HelloWorldImpl");
          hw.getName();

          結(jié)果是:
          before method invoke!
          劉凱毅
          after method invoke!
          在此 我只是想象,spring 還沒有看,但我認為spring 這個著名的框架應(yīng)該在這方面有很好的實現(xiàn)。

          實際代碼:希望spring可以向我上面的方法配置好用來取代下面的實際代碼 ^_^
          package?test.proxy;

          import?java.lang.reflect.InvocationHandler;
          import?java.lang.reflect.Method;
          import?java.lang.reflect.Proxy;

          import?junit.framework.TestCase;

          public?class?TestProxy?extends?TestCase?{
          ????
          ????
          protected?void?setUp()?throws?Exception?{
          ????????
          super.setUp();
          ????}
          ????
          ????
          public?void?testProxy(){
          ?????????????HelloWorld?hw?
          =?new?HelloWorldImpl();???????????
          ???????????????????????InvocationHandler?handler?
          =?new?HelloWorldHandler(hw);??????????
          ???????????????????????HelloWorld?proxy?
          =?(HelloWorld)?Proxy.newProxyInstance(???
          ?????????????????????????????????????hw.getClass().getClassLoader(),???
          ?????????????????????????????????????hw.getClass().getInterfaces(),???
          ?????????????????????????????????????handler);???
          ???????????????????????proxy.sayHelloWorld();
          ???????????????????????
          ???????????????????????System.out.println();
          ???????????????????????proxy.setName(
          "liukaiyi");
          ???????????????????????proxy.getName();
          ????}
          ????
          }

          interface?HelloWorld?{???
          ????
          void?sayHelloWorld()?;???
          ????
          void?getName();
          ????
          void?setName(String?name);
          }

          class?HelloWorldImpl?implements?HelloWorld?{???
          ????
          private?String?name?=?"";
          ????
          public?void?setName(String?name)?{
          ????????
          this.name?=?name;
          ????}

          ????
          public?void?sayHelloWorld()?{???
          ????????System.out.println(
          "Hello?World!");??????????????
          ????}

          ????
          public?void?getName()?{
          ????????System.out.println(
          this.name);
          ????}???
          }

          class?HelloWorldHandler?implements?InvocationHandler?{???
          ????????????
          //要代理的原始對象???
          ????????????private?Object?objOriginal;???
          ????????????
          /**??
          ?????????????*?構(gòu)造函數(shù)。??
          ?????????????*?
          @param?obj?要代理的原始對象。??
          ?????????????
          */??
          ????????????
          public?HelloWorldHandler(Object?obj)?{???
          ???????????????????
          this.objOriginal?=?obj?;???
          ????????????}???
          ????????????
          public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)???
          ??????????????????????????
          throws?Throwable?{???????????????
          ???????????????????Object?result?
          =?null?;??????????????
          ???????????????????String?meName?
          =?method.getName();
          ???????????????????
          if(meName.indexOf("set")>-1?){
          ???????????????????????
          return?method.invoke(this.objOriginal?,args);???
          ???????????????????}
          ???????????????????
          if(?meName.equals("getName")?){
          ????????????????????
          //方法調(diào)用之前???
          ???????????????????????????doBefore();?//仿佛是AOP的影子,呵呵???
          ???????????????????}
          ?????????????????????
          //調(diào)用原始對象的方法???
          ???????????????????????????result?=?method.invoke(this.objOriginal?,args);???
          ?????????????????????
          //方法調(diào)用之后???
          ???????????????????????????doAfter();???????
          ???????????????????
          ???????????????????
          return?result?;???
          ????????????}???
          ????????????
          private?void?doBefore()?{???
          ???????????????????System.out.println(
          "before?method?invoke!");???
          ????????????}???
          ????????????
          private?void?doAfter()?{???
          ???????????????????System.out.println(
          "after?method?invoke!");???
          ????????????}???
          ?????}???


          結(jié)果:
          Hello World!
          after method invoke!

          before method invoke!
          劉凱毅
          after method invoke!


          評論

          # re: 為我學(xué)習(xí) Spring AOP 準備(Proxy)  回復(fù)  更多評論   

          2007-10-09 12:05 by 千里冰封
          呵呵,用代理還是比較好玩的

          # re: 為我學(xué)習(xí) Spring AOP 準備(Proxy)  回復(fù)  更多評論   

          2008-03-13 18:14 by bless
          要是很多不同的被代理類的函數(shù)返回值、里面的判斷條件等等的好多種,很復(fù)雜,那invoke里豈不是要寫很多判斷條件,那時候怎么辦啊。
          主站蜘蛛池模板: 姚安县| 改则县| 伊春市| 湖口县| 陵川县| 湖州市| 蓬莱市| 聊城市| 裕民县| 江口县| 大同市| 犍为县| 高青县| 德惠市| 平利县| 常德市| 安义县| 宜川县| 南通市| 治多县| 庆元县| 珠海市| 耿马| 海盐县| 金阳县| 两当县| 襄垣县| 金寨县| 宣城市| 长沙市| 潼南县| 阿克苏市| 牙克石市| 鄂伦春自治旗| 法库县| 镇安县| 旺苍县| 连城县| 双鸭山市| 文成县| 本溪|