主題:AspectJ的一個簡單例子
AspectJ已經很成熟,並且有一個成熟的編輯工具:AJDT (eclipse外掛)
下面介紹一個AspectJ的簡單例子,從而對AspectJ有一個直觀的認識:
在面嚮物件語言中,我們一般用一個類處理一個關注點的需求。
但是在很多情況下,類不僅要處理自己的關注點,還必須滿足另一個關注點的需求。
也就是說類被系統中的多個關注點橫切了.
在類中多種關注點的混合將會導致程式碼分散 和程式碼糾纏 的發生。
程式碼分散 是指處理一個關注點所需的程式碼會分散到處理其他關注點的類中。
程式碼糾纏 是指利用一個類或方法實現了系統中的多個關注點。
下面是一個People類:
Java程式碼public class People {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
這個類實現了系統中People資料物件的類模型。我們把它稱為主要關注點。
但是現在出現了一個新的需求,就是對所有People物件的屬性訪問都要記錄日誌。
即一個次要關注點(橫切關注點):對所有People物件的屬性訪問都要記錄日誌。
下面是將次要關注點直接編碼到People類的程式碼:
Java程式碼public class People {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println(">>> Log : modify people's attribute ...");
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
System.out.println(">>> Log : modify people's attribute ...");
this.age = age;
}
}
雖然People類實現了日誌功能,不過日誌關注點的程式碼分散到了實現People類模型的程式碼中(程式碼分散),而且People
類實現了多個關注點(程式碼糾纏)。這樣對程式碼的修改於維護都是很不利的。
現在我們利用AspectJ來將這兩個關注點分離。下面是AspectJ程式碼:
Java程式碼利用AspectJ編譯器編譯AspectJ程式和第一個People類(即將AspectJ程式織入到第一個People類中),
然後執行下面的主程式測試:
Java程式碼控制檯輸出如下:
>>> Log : modify people's attribute ...
>>> Log : modify people's attribute ...
我們發現同樣實現了日誌功能,而且程式結構更加清晰。
AspectJ的語法類似於Java的語法,不過有一些特殊的關鍵字,關於它的更多內容請參見AspectJ官方文件。