posts - 495,  comments - 11,  trackbacks - 0
          好長時間沒有用過Spring了. 突然拿起書.我都發現自己對AOP都不熟悉了.
          其實AOP的意思就是面向切面編程.
          OO注重的是我們解決問題的方法(封裝成Method),而AOP注重的是許多解決解決問題的方法中的共同點,是對OO思想的一種補充!
          還是拿人家經常舉的一個例子講解一下吧:
          比如說,我們現在要開發的一個應用里面有很多的業務方法,但是,我們現在要對這個方法的執行做全面監控,或部分監控.也許我們就會在要一些方法前去加上一條日志記錄,
          我們寫個例子看看我們最簡單的解決方案
          我們先寫一個接口IHello.java代碼如下:
          1packagesinosoft.dj.aop.staticaop;
          2
          3publicinterfaceIHello{
          4??/**
          5????? * 假設這是一個業務方法
          6????? *@paramname
          7?????*/

          8????voidsayHello(String name);
          9}

          10

          里面有個方法,用于輸入"Hello" 加傳進來的姓名;我們去寫個類實現IHello接口
          packagesinosoft.dj.aop.staticaop;

          publicclassHelloimplementsIHello{

          ????
          publicvoidsayHello(String name){
          ???????? System.out.println(
          "Hello"+name);
          ???? }


          }


          現在我們要為這個業務方法加上日志記錄的業務,我們在不改變原代碼的情況下,我們會去怎么做呢?也許,你會去寫一個類去實現IHello接口,并依賴Hello這個類.代碼如下:
          1packagesinosoft.dj.aop.staticaop;
          2
          3publicclassHelloProxyimplementsIHello{
          4????privateIHello hello;
          5
          6????publicHelloProxy(IHello hello){
          7????????this.hello=hello;
          8???? }

          9
          10????publicvoidsayHello(String name){
          11???????? Logger.logging(Level.DEBUGE,"sayHello method start.");
          12???????? hello.sayHello(name);
          13???????? Logger.logging(Level.INFO,"sayHello method end!");
          14
          15???? }

          16
          17}

          18

          其中.Logger類和Level枚舉代碼如下:
          Logger.java
          1packagesinosoft.dj.aop.staticaop;
          2
          3importjava.util.Date;
          4
          5publicclassLogger{
          6??/**
          7????? * 根據等級記錄日志
          8????? *@paramlevel
          9????? *@paramcontext
          10?????*/

          11????publicstaticvoidlogging(Level level, String context){
          12????????if(level.equals(Level.INFO)){
          13???????????? System.out.println(newDate().toLocaleString()+""+context);
          14???????? }

          15????????if(level.equals(Level.DEBUGE)){
          16???????????? System.err.println(newDate()+""+context);
          17???????? }

          18???? }

          19
          20}

          21
          Level.java

          1packagesinosoft.dj.aop.staticaop;
          2
          3publicenumLevel{
          4???? INFO,DEBUGE;
          5}

          6
          那我們去寫個測試類看看,代碼如下:
          Test.java
          1packagesinosoft.dj.aop.staticaop;
          2
          3publicclassTest{
          4????publicstaticvoidmain(String[] args){
          5???????? IHello hello=newHelloProxy(newHello());
          6???????? hello.sayHello("Doublej");
          7???? }

          8}

          9
          運行以上代碼我們可以得到下面結果:

          Tue Mar0420:57:12CST2008sayHello method start.
          Hello Doublej
          2008-3-420:57:12sayHello method end!

          從上面的代碼我們可以看出,hello對象是被HelloProxy這個所謂的代理態所創建的.這樣,如果我們以后要把日志記錄的功能去掉.那我們只要把得到hello對象的代碼改成以下:
          1packagesinosoft.dj.aop.staticaop;
          2
          3publicclassTest{
          4????publicstaticvoidmain(String[] args){
          5???????? IHello hello=newHello();
          6???????? hello.sayHello("Doublej");
          7???? }

          8}

          9

          上面代碼,可以說是AOP最簡單的實現!
          posted on 2009-07-24 20:37 jadmin 閱讀(77) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 锡林郭勒盟| 察隅县| 吕梁市| 青川县| 河源市| 繁峙县| 察隅县| 克东县| 孝昌县| 西充县| 云龙县| 上饶市| 屯昌县| 新源县| 贵南县| 杭锦后旗| 桃源县| 浠水县| 新乡市| 墨玉县| 夹江县| 炎陵县| 上饶县| 利津县| 通河县| 临夏县| 连平县| 海城市| 高陵县| 苍山县| 波密县| 调兵山市| 丰顺县| 天气| 怀宁县| 兴业县| 迁安市| 宁武县| 土默特右旗| 宜州市| 罗甸县|