AOP與OOP的區別

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

  1. public class Client {  

  2.   

  3.     /** 

  4.      * @param args 

  5.      */  

  6.     public static void main(String[] args) {  

  7.         BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-beans.xml");  

  8.         UserManager userManager = (UserManager)factory.getBean("userManager");  

  9.         //userManager.addUser("張三", "123");  

  10.           userManager.delUser(123);  

  11.             //String name = userManager.findUserById(100);  

  12.            //System.out.println(name);  

  13.     }  

  14. }  


SecurityHandler類:

[java] view plaincopy

  1. public class SecurityHandler {  

  2.       

  3.     public void checkSecurity(){  

  4.         System.out.println("-----------checkSecurity()------------");  

  5.     }  

  6. }  


UserManager接口:

[java] view plaincopy

  1. public interface UserManager {  

  2.   

  3.     public void addUser(String username,String password);  

  4.       

  5.     public void delUser(int userId);  

  6.       

  7.     public String findUserById(int userId);  

  8.       

  9.     public void  modifyUser(int userId,String username,String password);  

  10.       

  11. }  


UserManagerImpl類:

[java] view plaincopy

  1. public class UserManagerImpl implements UserManager {  

  2.   

  3.     @Override  

  4.     public void addUser(String username, String password) {  

  5.         System.out.println("-----------UserManagerImpl.addUser()-------------");  

  6.   

  7.     }  

  8.   

  9.     @Override  

  10.     public void delUser(int userId) {  

  11.         System.out.println("-----------UserManagerImpl.delUser()-------------");  

  12.   

  13.     }  

  14.   

  15.     @Override  

  16.     public String findUserById(int userId) {  

  17.         System.out.println("-----------UserManagerImpl.findUserById()-------------");  

  18.         return "張三";  

  19.     }  

  20.   

  21.     @Override  

  22.     public void modifyUser(int userId, String username, String password) {  

  23.         System.out.println("-----------UserManagerImpl.modifyUser()-------------");  

  24.   

  25.     }  

  26. }  


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對一個動做進行封裝,則有點不三不四。

相關文章
相關標籤/搜索