laoding
          本來我以為,隱身了別人就找不到我,沒有用的,像我這樣拉風的男人,無論走到哪里,都像在黑暗中的螢火蟲一樣,那樣的鮮明,那樣的出眾。我那憂郁的眼神,稀疏的胡茬,那微微隆起的將軍肚和親切的笑容......都深深吸引了眾人......
          posts - 0,  comments - 37,  trackbacks - 0

          一直就用spring的IOC,遺憾spring的另一重要組成部分AOP卻沒用過,所以近幾天抽空研究了下AOP,學了些東西,在這里記錄下spring2.0的aop配置,以一個簡單的記錄日志的實例來說明,先介紹下用XMLSchema來配置,下一篇介紹annotation配置,廢話不多說,開始吧
          先新建個web工程,將spring的包加進去,為方便就把全部的jar包加進去。

          先來看個接口,很簡單就兩個方法

          public interface Print {
              
          public String print(String name);
              
          public String sleep(String name);
          }

          接下來是實現類

          public class SystemPrint implements Print{
              
              
          public String print(String name){
                  String result
          ="hello " + name;
                  System.out.println(result);
                  
          return result;
              }
              
              
          public String sleep(String name){
                  String result
          =name+" is sleep now";
                  System.out.println(result);
                  
          return result;
              }
          }

          下面是所要織入的代碼,也就是我們要用來記錄日志的

          public class GetLog {
              
          public void getLog(ProceedingJoinPoint joinpoint) throws Throwable {
                  String reslut 
          = (String)joinpoint.proceed();
                  
          //這里是記錄日志的
                  System.out.println("result==="+reslut);
              }
          }

          再來看spring配置文件,沒有注釋的很清楚,可以去網上查查

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
              xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:aop
          ="http://www.springframework.org/schema/aop"
              xmlns:tx
          ="http://www.springframework.org/schema/tx"
              xmlns:jee
          ="http://www.springframework.org/schema/jee"
              xsi:schemaLocation
          ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
              http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
              http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
              http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"
          >
              
              
          <!--這個bean是作為切面    -->
              
          <bean id="log" class="spring2aop.GetLog"></bean>

              
          <!--
                  注意這里:expression="execution(* spring2aop.*.print*(..))" 
                  括號里面第一個*號代表返回值 接下來  spring2aop.*. 是你要切入的代碼的大概路徑,這里為什么用大概路徑來形容呢
                  因為這里的意思是符合以spring2aop的路徑都會作為選擇的對象,也不詳細介紹,查下就明白了, print*(..)是指
                  方法名以print開頭的都符合,括號里面的 .. 表示參數是隨意的都可以。
              
          -->
              
          <aop:config>
                  
          <aop:aspect ref="log">
                      
          <aop:pointcut id="printMethods" expression="execution(* spring2aop.*.print*(..))"/>
                      
          <aop:after-returning method="getLog" pointcut-ref="printMethods" returning="retVal"/>
                  
          </aop:aspect>
              
          </aop:config>
              
              
          <aop:config>
                  
          <aop:aspect ref="log">
                      
          <aop:pointcut id="sleepMethods" expression="execution(* spring2aop.*.sle*(..))"/>
                      
          <aop:after-returning method="getLog" pointcut-ref="sleepMethods" returning="retVal"/>
                  
          </aop:aspect>
              
          </aop:config>
              
              
          <!--要織入代碼的bean-->
              
          <bean id="print" class="spring2aop.SystemPrint"></bean>

          </beans>

          測試類:
          public class Test {

              
          /**  
               *   @Description 方法實現功能描述  
               *   
          @param args
               *   void
               *   
          @throws  拋出異常說明
               
          */
              
          public static void main(String[] args) {
                  ApplicationContext act 
          = new ClassPathXmlApplicationContext(
                  
          "applicationContext20.xml");
                  Print t 
          =(Print)act.getBean("print");
                  t.print(
          "ding");
                  System.out.println(
          "-----------------");
                  t.sleep(
          "laoding");

              }


          }

          運行這個類,得到如下結果:
          hello ding
          hello ding
          result===hello ding
          -----------------
          laoding is sleep now
          laoding is sleep now
          result===laoding is sleep now

          這里的hello ding 打印了兩次,不用擔心,這是因為執行到getLog切面類的
           String reslut = (String)joinpoint.proceed();這句代碼的時候再執行了一次,這句代碼是取回
          返回結果的,可以設置個斷點來測試下好了這里就輸出的result就是記錄的日志,當然
          這里只是個很簡單的實現,但是很簡單的實現卻很容易說清楚原理。

          posted on 2008-11-25 18:14 老丁 閱讀(3458) 評論(4)  編輯  收藏 所屬分類: spring

          FeedBack:
          # re: spring aop簡單日志實例(1)
          2009-11-07 14:16 | 真爛
          垃圾,您還是改行吧。  回復  更多評論
            
          # re: spring aop簡單日志實例(1)
          2009-11-10 16:34 | 老丁
          朋友,請自重!如果覺得爛請繞道!
            回復  更多評論
            
          # re: spring aop簡單日志實例(1)
          2009-11-12 11:53 |
          ProceedingJoinPoint 少一個類  回復  更多評論
            
          # re: spring aop簡單日志實例(1)
          2011-11-15 15:32 | codeme
          <aop:config>
          <aop:aspect ref="log">
          <aop:pointcut id="printMethods" expression="execution(* spring2aop.*.print*(..))"/>
          <aop:after-returning method="getLog" pointcut-ref="printMethods" returning="retVal"/>
          </aop:aspect>
          </aop:config>

          <aop:config>
          <aop:aspect ref="log">
          <aop:pointcut id="sleepMethods" expression="execution(* spring2aop.*.sle*(..))"/>
          <aop:after-returning method="getLog" pointcut-ref="sleepMethods" returning="retVal"/>
          </aop:aspect>
          </aop:config>
          沒有這么配置的吧,怎么不寫到一起?  回復  更多評論
            
          本博客主為學習和復習之用,無關其他,想罵人的繞道
          Email:dkm123456@126.com
          大家一起交流進步
          QQ:283582761


          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          留言簿(4)

          我參與的團隊

          文章分類(50)

          文章檔案(48)

          相冊

          朋友

          搜索

          •  

          積分與排名

          • 積分 - 96529
          • 排名 - 600

          最新評論

          主站蜘蛛池模板: 开平市| 商河县| 宜君县| 吴江市| 澳门| 漾濞| 浦县| 堆龙德庆县| 武冈市| 云浮市| 仙居县| 武平县| 田东县| 刚察县| 长寿区| 临清市| 拜泉县| 连南| 思茅市| 霞浦县| 青冈县| 大姚县| 磐安县| 浠水县| 宝应县| 昌吉市| 互助| 专栏| 昆山市| 加查县| 文水县| 新兴县| 锡林浩特市| 云阳县| 嘉黎县| 太谷县| 宁波市| 齐齐哈尔市| 明水县| 岳西县| 绩溪县|