AOP簡介 今天來介紹一下AOP。AOP,中文常被翻譯為“面向切麵編程”,其作為OOP的擴展,其思想除了在Spring中得到了應用,也是不錯的設計方法。通常情況下,一個軟體系統,除了正常的業務邏輯代碼,往往還有一些功能性的代碼,比如:記錄日誌、數據校驗等等。最原始的辦法就是直接在你的業務邏輯代碼中編 ...
AOP簡介
今天來介紹一下AOP。AOP,中文常被翻譯為“面向切麵編程”,其作為OOP的擴展,其思想除了在Spring中得到了應用,也是不錯的設計方法。通常情況下,一個軟體系統,除了正常的業務邏輯代碼,往往還有一些功能性的代碼,比如:記錄日誌、數據校驗等等。最原始的辦法就是直接在你的業務邏輯代碼中編寫這些功能性代碼,但是,這樣除了當時開發的時候比較方便以外;代碼的閱讀性、可維護性都會大大降低。而且,當你需要頻繁使用一個功能的時候(比如記錄日誌),你還需要重覆編寫。而使用AOP的好處,簡單來說就是,它能把這種重覆性的功能代碼抽離出來,在需要的時候,通過動態代理技術,在不修改源代碼的情況下提供增強性功能。
優勢:
- 減少重覆代碼
- 提高開發效率
- 代碼更加整潔,提高了可維護性
說了這麼多,簡單演示一下,我們假定有一個計算器對象,並能實現基本的加減乘除運算;同時,我們希望對相應的操作進行日誌的記錄。
public interface ArithmeticCalculator {
int add(int i, int j);
int sub(int i, int j);
int mul(int i, int j);
int div(int i, int j);
}
在這裡,我們定義了一個介面ArithmeticCalculator 來完成加減乘除運算,並將其具體實現交由其實現類完成。
public class ArithmeticCalculatorImpl implements ArithmeticCalculator {
@Override
public int add(int i, int j) {
System.out.println(i + "和 " + j + "開始加法運算");
int reusult = i + j;
System.out.println("加法運算結果是: " + reusult);
return reusult;
}
@Override
public int sub(int i, int j) {
System.out.println(i + "和 " + j + "開始減法運算");
int reusult = i - j;
System.out.println("減法運算結果是: " + reusult);
return reusult;
}
@Override
public int mul(int i, int j) {
System.out.println(i + "和 " + j + "開始乘法運算");
int reusult = i * j;
System.out.println("乘法運算結果是: " + reusult);
return reusult;
}
@Override
public int div(int i, int j) {
if (j == 0) {
throw new ArithmeticException("除數" + j + "不能為0");
}
System.out.println(i + "和 " + j + "開始除法運算");
int reusult = i / j;
System.out.println("除法運算結果是: " + reusult);
return reusult;
}
}
在這裡,我們看見了很噁心的代碼:大量重覆性的記錄日誌的代碼,而且,當你更改的時候,你發現並不方便。後續我們會對這個代碼進行改寫。
AOP的實現方式
AOP通過動態代理的來實現。
在這裡先簡單介紹一下動態代理:使用一個代理將對象包裝起來, 然後用該代理對象取代原始對象.。任何對原始對象的調用都要通過代理. 代理對象決定是否以及何時將方法調用轉到原始對象上。其調用過程如下圖所示: