關於AOP的應用實例

開發環境:Eclipse3.2.1+JBossIDE1.6
,AOP的攔截器應用
1,新建AOP工程,在新建嚮導中選擇JBossAOP下的JBossAOP Project,輸入項目名爲:TestAOP,Java Version爲Java 1.5,結束嚮導.
2,系統自動生成AOP配置文件jboss-aop.xml文件,內容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<aop/>
3,新建Java類,名爲Test,勾選main方法,代碼如下:
package test;
 
publicclass HelloAOP {
 
    /**
     *@paramargs
     */
    publicstaticvoid main(String[] args) {
        // TODO自動生成方法存根
        HelloAOP hello= new HelloAOP();
        hello.sayHello();
    }
    publicvoid sayHello(){
        System.out.println("Hello");
    }
}
4,新建攔截器.名爲HelloAOPInterceptor.java,並實現Interceptor接口,代碼如下:
package test;
 
import org.jboss.aop.advice.Interceptor;
import org.jboss.aop.joinpoint.Invocation;
 
publicclass HelloAOPInterceptor implements Interceptor {
 
    public String getName() {
        // TODO自動生成方法存根
        return"test.HelloAOPInterceptor";
    }
 
    public Object invoke(Invocation arg0) throws Throwable {
        // TODO自動生成方法存根
        System.out.println("Hello,AOP!");
        return arg0.invokeNext();
    }
 
}
5,將攔截器和要攔截的類用設置文件聯繫起來,在包資源管理視圖下,右擊類HelloAOP的sayHello方法,在彈出菜單中選擇JBoss AOP->Apply Interceptor(s),在Select an Interceptor..面板選擇test.HelloAOPInterceptor攔截器類,系統自動更新jboss-aop.xml文件,代碼爲:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<aop>
    <bind pointcut="execution(public void test.HelloAOP-&gt;sayHello())">
        <interceptor class="test.HelloAOPInterceptor"/>
    </bind>
</aop>
6,右擊HelloAOP類,在彈出菜單中選擇運行方式->運行…”,在對話框中選擇JBoss AOP Application,新建配置項.單擊運行按鈕,控制檯出現如下信息:
Hello,AOP!
Hello
即攔截器在sayHello方法調用前被調用.
二,AOP的Advice應用
1,新建Java類,名爲:HelloAOPAspect.java,代碼如下:
package test;
 
import org.jboss.aop.joinpoint.Invocation;
 
publicclass HelloAOPAdvice {
 
    public Object trace(Invocation invocation) throws Throwable{
        System.out.println("進入程序運行點");
        try {
            return invocation.invokeNext();   
        }finally {
            // TODO: handle exception
        System.out.println("離開程序運行點");   
        }
    }
}
2,與HelloAOP文件聯繫起來,包資源管理視圖下,右擊類HelloAOP的sayHello方法,在彈出菜單中選擇JBoss AOP->Apply Advice,在Apply Advice面板勾選Object trace(Invocation invocation),系統自動更新jboss-aop.xml文件,代碼爲:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<aop>
    <aspect class="test.HelloAOPAdvice" scope="PER_VM"/>
    <bind pointcut="execution(public void test.HelloAOP-&gt;sayHello())">
        <interceptor class="test.HelloAOPInterceptor"/>
        <advice aspect="test.HelloAOPAdvice" name="trace"/>
    </bind>
</aop>
3,利用剛新建的運行配置運行HelloAOP.java文件,控制檯出現如下信息:
Hello,AOP!
進入程序運行點
Hello
離開程序運行點
從此處可看到Advice在Interceptor之後介入,且方法sayHello()調用前後都起作用.
,AOP類中的域應用
1,修改HelloAOP代碼,添加私有變量message,利用源代碼菜單,實現其Getter/Setter方法,修改main方法,完整代碼如下:
package test;
 
publicclass HelloAOP {
 
    /**
     *@paramargs
     */
    private String message="Welcome";
   
    publicstaticvoid main(String[] args) {
        // TODO自動生成方法存根
        HelloAOP hello=new HelloAOP();
        hello.sayHello();
        System.out.println(hello.getMessage());
        hello.setMessage("Benson");
        System.out.println(hello.getMessage());
    }
   
    publicvoid sayHello(){
        System.out.println("Hello");
    }
 
    public String getMessage() {
        returnmessage;
    }
 
    publicvoid setMessage(String message) {
        this.message = message;
    }
 
}
2, 包資源管理視圖下,右擊類HelloAOP的域message,在彈出菜單中選擇JBoss AOP->Apply Interceptor(s),在Select an Interceptor..面板選擇test.HelloAOPInterceptor攔截器類,系統自動更新jboss-aop.xml文件,文件內容爲:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<aop>
    <aspect class="test.HelloAOPAdvice" scope="PER_VM"/>
    <bind pointcut="execution(public void test.HelloAOP-&gt;sayHello())">
        <interceptor class="test.HelloAOPInterceptor"/>
        <advice aspect="test.HelloAOPAdvice" name="trace"/>
    </bind>
    <bind pointcut="field(private java.lang.String test.HelloAOP-&gt;message)">
        <interceptor class="test.HelloAOPInterceptor"/>
    </bind>
</aop>
3, 利用剛新建的運行配置運行HelloAOP.java文件,控制檯出現如下信息:
Hello,AOP!
Hello,AOP!
進入程序運行點
Hello
離開程序運行點
Hello,AOP!
Welcome
Hello,AOP!
Hello,AOP!
Benson
   當域message被訪問時(調用get或set時),都會調用攔截器.可以看得出攔截器在對象初始化時,對域message也起作用.
4,利用相似的方法,可以給域message設置advice.包資源管理視圖下,右擊類HelloAOP的域message,在彈出菜單中選擇JBoss AOP->Apply Advice,在Apply Advice面板勾選Object trace(Invocation invocation),系統自動更新jboss-aop.xml文件,代碼爲:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<aop>
    <aspect class="test.HelloAOPAdvice" scope="PER_VM"/>
    <bind pointcut="execution(public void test.HelloAOP-&gt;sayHello())">
        <interceptor class="test.HelloAOPInterceptor"/>
        <advice aspect="test.HelloAOPAdvice" name="trace"/>
    </bind>
    <bind pointcut="field(private java.lang.String test.HelloAOP-&gt;message)">
        <interceptor class="test.HelloAOPInterceptor"/>
        <interceptor class="test.HelloAOPInterceptor"/>
        <advice aspect="test.HelloAOPAdvice" name="trace"/>
    </bind>
</aop>
5,利用剛新建的運行配置運行HelloAOP.java文件,控制檯出現如下信息:
Hello,AOP!
Hello,AOP!
進入程序運行點
離開程序運行點
Hello,AOP!
進入程序運行點
Hello
離開程序運行點
Hello,AOP!
Hello,AOP!
進入程序運行點
離開程序運行點
Welcome
Hello,AOP!
Hello,AOP!
進入程序運行點
離開程序運行點
Hello,AOP!
Hello,AOP!
進入程序運行點
離開程序運行點
Benson
發佈了50 篇原創文章 · 獲贊 2 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章