熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

關於AOP的應用實例

2013-11-23 19:37:25  來源: Java核心技術 

  開發環境:Eclipse+JBossIDE
    一AOP的攔截器應用
    新建AOP工程在新建向導中選擇JBossAOP下的JBossAOP Project輸入項目名為:TestAOPJava Version為Java 結束向導
    系統自動生成AOP配置文件jbossaopxml文件內容如下:
    <?xml version= encoding=UTF standalone=yes?>
    <aop/>
    新建Java類名為Test勾選main方法代碼如下:
    package test;

  publicclass HelloAOP {

  /**
         *@paramargs
         */
        publicstaticvoid main(String[] args) {
            // TODO自動生成方法存根
            HelloAOP hello= new HelloAOP();
            hellosayHello();
        }
        publicvoid sayHello(){
            Systemoutprintln(Hello);
        }
    }
    新建攔截器名為HelloAOPInterceptorjava並實現Interceptor接口代碼如下:
    package test;

  import orgjbossaopadviceInterceptor;
    import orgjbossaopjoinpointInvocation;

  publicclass HelloAOPInterceptor implements Interceptor {

  public String getName() {
            // TODO自動生成方法存根
            returntestHelloAOPInterceptor;
        }

  public Object invoke(Invocation arg) throws Throwable {
            // TODO自動生成方法存根
            Systemoutprintln(HelloAOP!);
            return arginvokeNext();
        }

  }
    將攔截器和要攔截的類用設置文件聯系起來包資源管理視圖下右擊類HelloAOP的sayHello方法在彈出菜單中選擇JBoss AOP>Apply Interceptor(s)…在Select an Interceptor面板選擇testHelloAOPInterceptor攔截器類系統自動更新jbossaopxml文件代碼為:
    <?xml version= encoding=UTF standalone=yes?>
    <aop>
        <bind pointcut=execution(public void testHelloAOP&gt;sayHello())>
            <interceptor class=testHelloAOPInterceptor/>
        </bind>
    </aop>
    右擊HelloAOP類在彈出菜單中選擇運行方式>運行…在對話框中選擇JBoss AOP Application新建配置項單擊運行按鈕控制台出現如下信息:
    HelloAOP!
    Hello
    即攔截器在sayHello方法調用前被調用
    二AOP的Advice應用
    新建Java類名為:HelloAOPAspectjava代碼如下:
    package test;

  import orgjbossaopjoinpointInvocation;

  publicclass HelloAOPAdvice {

  public Object trace(Invocation invocation) throws Throwable{
            Systemoutprintln(進入程序運行點);
            try {
                return invocationinvokeNext();
            }finally {
                // TODO: handle exception
            Systemoutprintln(離開程序運行點);
            }
        }
    }
    與HelloAOP文件聯系起來包資源管理視圖下右擊類HelloAOP的sayHello方法在彈出菜單中選擇JBoss AOP>Apply Advice…在Apply Advice…面板勾選Object trace(Invocation invocation)系統自動更新jbossaopxml文件代碼為:
    <?xml version= encoding=UTF standalone=yes?>
    <aop>
        <aspect class=testHelloAOPAdvice scope=PER_VM/>
        <bind pointcut=execution(public void testHelloAOP&gt;sayHello())>
            <interceptor class=testHelloAOPInterceptor/>
            <advice aspect=testHelloAOPAdvice name=trace/>
        </bind>
    </aop>
 

  利用剛新建的運行配置運行HelloAOPjava文件控制台出現如下信息:
    HelloAOP!
    進入程序運行點
    Hello
    離開程序運行點
    從此處可看到Advice在Interceptor之後介入且方法sayHello()調用前後都起作用
    三AOP類中的域應用
    修改HelloAOP代碼添加私有變量message利用源代碼菜單實現其Getter/Setter方法修改main方法完整代碼如下:
    package test;

  publicclass HelloAOP {

  /**
         *@paramargs
         */
        private String message=Welcome;

  publicstaticvoid main(String[] args) {
            // TODO自動生成方法存根
            HelloAOP hello=new HelloAOP();
            hellosayHello();
            Systemoutprintln(hellogetMessage());
            hellosetMessage(Benson);
            Systemoutprintln(hellogetMessage());
        }

  publicvoid sayHello(){
            Systemoutprintln(Hello);
        }

  public String getMessage() {
            returnmessage;
        }

  publicvoid setMessage(String message) {
            ssage = message;
        }

  }
    包資源管理視圖下右擊類HelloAOP的域message在彈出菜單中選擇JBoss AOP>Apply Interceptor(s)…在Select an Interceptor面板選擇testHelloAOPInterceptor攔截器類系統自動更新jbossaopxml文件文件內容為:
    <?xml version= encoding=UTF standalone=yes?>
    <aop>
        <aspect class=testHelloAOPAdvice scope=PER_VM/>
        <bind pointcut=execution(public void testHelloAOP&gt;sayHello())>
            <interceptor class=testHelloAOPInterceptor/>
            <advice aspect=testHelloAOPAdvice name=trace/>
        </bind>
        <bind pointcut=field(private javalangString testHelloAOP&gt;message)>
            <interceptor class=testHelloAOPInterceptor/>
        </bind>
    </aop>
    利用剛新建的運行配置運行HelloAOPjava文件控制台出現如下信息:
    HelloAOP!
    HelloAOP!
    進入程序運行點
    Hello
    離開程序運行點
    HelloAOP!
    Welcome
    HelloAOP!
    HelloAOP!
    Benson
       當域message被訪問時(調用get或set時)都會調用攔截器可以看得出攔截器在對象初始化時對域message也起作用
    利用相似的方法可以給域message設置advice包資源管理視圖下右擊類HelloAOP的域message在彈出菜單中選擇JBoss AOP>Apply Advice…在Apply Advice…面板勾選Object trace(Invocation invocation)系統自動更新jbossaopxml文件代碼為:
    <?xml version= encoding=UTF standalone=yes?>
    <aop>
        <aspect class=testHelloAOPAdvice scope=PER_VM/>
        <bind pointcut=execution(public void testHelloAOP&gt;sayHello())>
            <interceptor class=testHelloAOPInterceptor/>
            <advice aspect=testHelloAOPAdvice name=trace/>
        </bind>
        <bind pointcut=field(private javalangString testHelloAOP&gt;message)>
            <interceptor class=testHelloAOPInterceptor/>
            <interceptor class=testHelloAOPInterceptor/>
            <advice aspect=testHelloAOPAdvice name=trace/>
        </bind>
    </aop>
 

  利用剛新建的運行配置運行HelloAOPjava文件控制台出現如下信息:
    HelloAOP!
    HelloAOP!
    進入程序運行點
    離開程序運行點
    HelloAOP!
    進入程序運行點
    Hello
    離開程序運行點
    HelloAOP!
    HelloAOP!
    進入程序運行點
    離開程序運行點
    Welcome
    HelloAOP!
    HelloAOP!
    進入程序運行點
    離開程序運行點
    HelloAOP!
    HelloAOP!
    進入程序運行點
    離開程序運行點
    Benson


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27198.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.