AOP爲Aspect OrientedProgramming的縮寫,意爲面向切面編程。那什麼又是面向切面?它與僅有一字之差的OOP又有着什麼樣的區別與聯繫?所謂的面向 切面編程實際上是對業務邏輯又進行了進一步的抽取,將多種業務邏輯中的公用部分抽取出來作成一種服務(好比日誌記錄,性能統計,安全驗證等),從而實現代碼 複用。另外這種服務經過配置能夠動態的給程序添加統一控制,利用AOP能夠對業務邏輯的各個部分進行分離,從而使得業務邏輯各部分之間的耦合度下降。要進 一步瞭解AOP咱們首先要弄清楚這幾個概念指的是什麼:java
1. Cross Cutting Concern:是一種獨立服務,它會遍及在系統的處理流程之中編程
2. Aspect 對橫切行關注點的模塊化安全
3. Advice對橫切行關注點的具體實現(有分類的概念,以前,以後,throw)app
4. Pointcut 它定義了Advice應用到哪些JoinPoint上,對Spring來講是方法調用ide
5. Weave 將Advice應用target Object上的過程叫織入,Spring支持的是動態織入模塊化
6. Target Object Advice被應用的對象函數
7. Proxy:Spring AOP默認使用JDK的動態代理,它的代理是運行時建立,也可使用CGLIB代理性能
8.Introduction 能夠動態的爲類添加方法 spa
9.JoinPoint:Advice在應用程序上執行的點或時機,Spring只支持方法的JointPoint.net
這些概念聽上去仍是比較抽象的,下面咱們經過AOP的原理圖和實例來具體看一下這些概念具體指的是什麼。
原理圖:
代碼:
Client類:
[java] view plaincopy
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-beans.xml");
UserManager userManager = (UserManager)factory.getBean("userManager");
//userManager.addUser("張三", "123");
userManager.delUser(123);
//String name = userManager.findUserById(100);
//System.out.println(name);
}
}
SecurityHandler類:
[java] view plaincopy
public class SecurityHandler {
public void checkSecurity(){
System.out.println("-----------checkSecurity()------------");
}
}
UserManager接口:
[java] view plaincopy
public interface UserManager {
public void addUser(String username,String password);
public void delUser(int userId);
public String findUserById(int userId);
public void modifyUser(int userId,String username,String password);
}
UserManagerImpl類:
[java] view plaincopy
public class UserManagerImpl implements UserManager {
@Override
public void addUser(String username, String password) {
System.out.println("-----------UserManagerImpl.addUser()-------------");
}
@Override
public void delUser(int userId) {
System.out.println("-----------UserManagerImpl.delUser()-------------");
}
@Override
public String findUserById(int userId) {
System.out.println("-----------UserManagerImpl.findUserById()-------------");
return "張三";
}
@Override
public void modifyUser(int userId, String username, String password) {
System.out.println("-----------UserManagerImpl.modifyUser()-------------");
}
}
Cross cutting concern:從圖中能夠看出AOP所提供的是一個安全驗證服務,這種安全驗證服務就是圖中Cross cutting concern(橫切關注點)。
SecurityHandler是對橫切關注點的模塊化。
SecurityHandler代碼中的checkDelSecurity()方法,checkAddSecurity()方法等是對橫切關注點的具體實現稱爲Advice,有三種狀況分別爲After,Before,Throw。
Pointcut, SecurityHandler類中的以@Pointcut註解進行描述的addAddMethod()等方法成爲切入點。
Join Point,當調用以某種規則命名的函數時執行Advice。在代碼中的體現就是當執行UserManager中以「add」開頭的函數addUser()後,緊接着執行checkAddSecurity()。
AOP與OOP的區別:
AOP、OOP在字面上雖然很是相似,但倒是面向不一樣領域的兩種設計思想。OOP(面向對象編程)針對業務處理過程的實體及其屬性和行爲進行抽象封裝,以得到更加清晰高效的邏輯單元劃分。
而AOP則是針對業務處理過程當中的切面進行提取,它所面對的是處理過程當中的某個步驟或階段,以得到邏輯過程當中各部分之間低耦合性的隔離效果。這兩種設計思想在目標上有着本質的差別。
舉 個簡單的例子,對於「僱員」這樣一個業務實體進行封裝,天然是OOP/OOD的任務,咱們能夠爲其創建一個「Employee」類,並將「僱員」相關的屬 性和行爲封裝其中。而用AOP設計思想對「僱員」進行封裝將無從談起。一樣,對於「權限檢查」這一動做片段進行劃分,則是AOP的目標領域。而經過 OOD/OOP對一個動做進行封裝,則有點不三不四。