關於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->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->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->sayHello())">
<interceptor class="test.HelloAOPInterceptor"/>
<advice aspect="test.HelloAOPAdvice" name="trace"/>
</bind>
<bind pointcut="field(private java.lang.String test.HelloAOP->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->sayHello())">
<interceptor class="test.HelloAOPInterceptor"/>
<advice aspect="test.HelloAOPAdvice" name="trace"/>
</bind>
<bind pointcut="field(private java.lang.String test.HelloAOP->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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.