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

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

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

          ? <function?name="getName">
          ??? <proxyBegin artt="name" value="liukaiyi"/>
          ??? ??? //使用Proxy來賦值 name那在實(shí)現(xiàn)代碼中就可以不用去關(guān)注象 session 等屬性的開關(guān)了
          ??? ??? //proxy中配置下 , 在實(shí)現(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 還沒有看,但我認(rèn)為spring 這個(gè)著名的框架應(yīng)該在這方面有很好的實(shí)現(xiàn)。

          實(shí)際代碼:希望spring可以向我上面的方法配置好用來取代下面的實(shí)際代碼 ^_^
          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?{???
          ????????????
          //要代理的原始對(duì)象???
          ????????????private?Object?objOriginal;???
          ????????????
          /**??
          ?????????????*?構(gòu)造函數(shù)。??
          ?????????????*?
          @param?obj?要代理的原始對(duì)象。??
          ?????????????
          */??
          ????????????
          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)用原始對(duì)象的方法???
          ???????????????????????????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!


          評(píng)論

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

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

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

          2008-03-13 18:14 by bless
          要是很多不同的被代理類的函數(shù)返回值、里面的判斷條件等等的好多種,很復(fù)雜,那invoke里豈不是要寫很多判斷條件,那時(shí)候怎么辦啊。

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 玛曲县| 三江| 隆德县| 大荔县| 肥乡县| 彩票| 铁岭市| 金乡县| 临高县| 郁南县| 开化县| 曲沃县| 黄陵县| 新宁县| 新巴尔虎右旗| 调兵山市| 虹口区| 黔西县| 伊金霍洛旗| 乌恰县| 兖州市| 九龙城区| 建始县| 塘沽区| 梅州市| 昌江| 平乡县| 鸡东县| 乐业县| 德昌县| 洛浦县| 迁西县| 中超| 布尔津县| 石台县| 和林格尔县| 上虞市| 宜兰市| 红原县| 五大连池市| 密山市|