關鍵字:
接觸spring有一段時間了,不過都是看的多,寫的少,工作忙,公司也不準備用。自己寫過一些小東西用到,也只用到了BeanFactory組裝對象,JdbcTemplate代替jdbc,事務管理。。。東抓一把,西抓一把,沒形成系統。最近也在看spring自帶的reference,一時手癢,寫了個AOP的創建advice的例子,比之單純地使用TransationProxyFactoryBean對AOP的理解又深入了點,打算看看它的源代碼,基于CGLIB的實現對類的代理不了解,倒是好奇它如何實現對接口的代理??也就是利用J2SE的動態代理技術。
例子如下:講述一間書店開始打折促銷,規則是每一名顧客只能買一本書,而且< spring in action>已經脫銷了。。。。。你可以去掉TestAdvice里的注釋看看各種運行結果,具體就不解釋咯,在代碼注釋里。
首先,你必須對增強(advice)有所了解,增強就是在特定連接點執行的動作。advice contains the logic of your aspect。增強,分為4類:
前增強(before) 在連接點之前調用
后增強(after) 在連接點執行之后調用、
環繞增強(around) 完整控制整個方法流程,必須調用MethodInvocation的proceed促使真實操作發生
異常增強 針對某個異常拋出時調用
書店,一個buyBook業務:
package com.denny_blue.springdemo.aop;
public interface BuyBook {
public void buyBook(String customer,String book)throws NoThisBookException;
}
實現此接口的一個業務對象,如果顧客要買< spring in action>就拋出NoThisBookException異常。
package com.denny_blue.springdemo.aop;
public class MyBuyBook implements BuyBook {
public void buyBook(String customer,String book)throws NoThisBookException{
if(book.equals("< spring in action>"))
throw new NoThisBookException("對不起,沒有"+book+"存貨了!");
System.out.println(customer+",你好,你已經購買了一本"+book+"!");
}
}
自定義兩個異常類,其中NoThisBookException被拋出時將觸發MyThrowsAdvice調用:
//NoThisBookException.java
package com.denny_blue.springdemo.aop;
public class NoThisBookException extends RuntimeException {
public NoThisBookException(String msg){
super(msg);
}
}
//BuyBookException.java
文章來源于領測軟件測試網 http://www.kjueaiud.com/