其實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

2

3


4


5

6

7

8

9

10

里面有個方法,用于輸入"Hello" 加傳進來的姓名;我們去寫個類實現IHello接口












現在我們要為這個業務方法加上日志記錄的業務,我們在不改變原代碼的情況下,我們會去怎么做呢?也許,你會去寫一個類去實現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

2

3


4

5

6


7

8

9

10


11


12

13

14

15

16

17

18

其中.Logger類和Level枚舉代碼如下:
Logger.java
1
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.java
2

3

4

5


6


7

8

9

10

11


12


13

14

15


16

17

18

19

20

21

1
packagesinosoft.dj.aop.staticaop;
2
3
publicenumLevel{
4
???? INFO,DEBUGE;
5
}
6
那我們去寫個測試類看看,代碼如下:
2

3


4

5

6

Test.java
1
packagesinosoft.dj.aop.staticaop;
2
3
publicclassTest{
4
????publicstaticvoidmain(String[] args){
5
???????? IHello hello=newHelloProxy(newHello());
6
???????? hello.sayHello("Doublej");
7
???? }
8
}
9
運行以上代碼我們可以得到下面結果:
2

3


4


5

6

7

8

9





從上面的代碼我們可以看出,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

2

3


4


5

6

7

8

9

上面代碼,可以說是AOP最簡單的實現!