好長時間沒有用過Spring了. 突然拿起書.我都發現自己對AOP都不熟悉了.其實AOP的意思就是面向切面編程.OO注重的是我們解決問題的方法(封裝成Method),而AOP注重的是許多解決解決問題的方法中的共同點,是對OO思想的一種補充!還是拿人家經常舉的一個例子講解一下吧:比如說,我們現在要開發的一個應用里面有很多的業務方法,但是,我們現在要對這個方法的執行做全面監控,或部分監控.也許我們就會在要一些方法前去加上一條日志記錄,我們寫個例子看看我們最簡單的解決方案我們先寫一個接口IHello.java代碼如下:1
packagesinosoft.dj.aop.staticaop;
2
3
publicinterfaceIHello{
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這個類.代碼如下:1
packagesinosoft.dj.aop.staticaop;
2
3
publicclassHelloProxyimplementsIHello{
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.java1
packagesinosoft.dj.aop.staticaop;
2
3
importjava.util.Date;
4
5
publicclassLogger{
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.java1
packagesinosoft.dj.aop.staticaop;
2
3
publicenumLevel{
4
???? INFO,DEBUGE;
5
}
6
那我們去寫個測試類看看,代碼如下:Test.java1
packagesinosoft.dj.aop.staticaop;
2
3
publicclassTest{
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對象的代碼改成以下:1
packagesinosoft.dj.aop.staticaop;
2
3
publicclassTest{
4
????publicstaticvoidmain(String[] args){
5
???????? IHello hello=newHello();
6
???????? hello.sayHello("Doublej");
7
???? }
8
}
9
上面代碼,可以說是AOP最簡單的實現!
posted on 2009-07-24 20:37
jadmin 閱讀(74)
評論(0) 編輯 收藏