AOP程式設計

2021-10-23 01:18:02 字數 2923 閱讀 6915

一、什麼是aop?

同上篇ioc程式設計一樣,aop也是一種程式設計思想,而不是一門技術。aop的全稱叫aspect-oriented programming,也叫面向切面程式設計。在理解什麼事aop之前,我們需先知道什麼是分散關注。

分散關注

即將通用需求功能從不相關類之中分離出來;同時,能夠使得很多類共享乙個行為,一旦行為發生變化,不必修改很多類,只要修改這個行為就可以。aop就是這種實現分散關注的程式設計方法,它將「關注」封裝在「方面」中。

aop也可以說是oop(object-oriented programing,物件導向程式設計)的補充和完善。oop引入封裝、繼承和多型性等概念來建立一種物件層次結構,用以模擬公共行為的乙個集合。當我們需要為分散的物件引入公共行為的時候,oop則顯得無能為力。也就是說,oop允許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌**往往水平地散布在所有物件層次中,而與它所散布到的物件的核心功能毫無關係。對於其他型別的**,如安全性、異常處理和透明的持續性也是如此。這種散布在各處的無關的**被稱為橫切(cross-cutting)**,在oop設計中,它導致了大量**的重複,而不利於各個模組的重用。

二、為什麼要用aop?

現在舉乙個實際的例子來說明aop到底為我們解決了什麼問題

例:當前有個dao介面,其有insert、delete、update三個方法,還有個實現類daoimpl:

public inte***ce dao
public class daoimpl implements dao 

@override

public void delete()

@override

public void update()

}

現需在insert與update被呼叫的前後,列印呼叫前的毫秒數與呼叫後的毫秒數

1.最原始的寫法:

public class serviceimpl 

public void delete()

public void update()

}

這是最原始的寫法,這種寫法的缺點也是一目了然:

方法呼叫前後輸出時間的邏輯無法復用,如果有別的地方要增加這段邏輯就得再寫一遍,如果dao有其它實現類,那麼必須新增乙個類去包裝該實現類,這將導致類數量不斷膨脹

2.裝飾器模式:

public class logdao implements dao 

@override

public void insert()

@override

public void delete()

@override

public void update()

}

裝飾器的優點為:

透明,對呼叫方來說,它只知道dao,而不知道加上了日誌功能

類不會無限膨脹,如果dao的其它實現類需要輸出日誌,只需要向logdao的建構函式中傳入不同的dao實現類即可

不過這種方式同樣有明顯的缺點,缺點為:

輸出日誌的邏輯還是無法復用

輸出日誌的邏輯與**有耦合,如果我要對delete()方法前後同樣輸出時間,需要修改logdao

但是,這種做法相比最原始的**寫法,已經有了很大的改進。

3.**模式:

public class loginvocationhandler implements invocationhandler 

@override

public object invoke(object proxy, method method, object args) throws throwable

return method.invoke(obj, args);}}

其呼叫方式很簡單:

public static void main(string args) , new loginvocationhandler(dao));

proxydao.insert();

system.out.println("----------分割線----------");

proxydao.delete();

system.out.println("----------分割線----------");

proxydao.update();

}

這種方式的優點為:

輸出日誌的邏輯被復用起來

但還是有缺點:

**之間的耦合還是沒有解決,像要針對delete()方法加上這部分邏輯就必須修改**

4.aop

首先定義乙個時間處理類,我將它命名為timehandler:

public class timehandler  catch (throwable e) }}

}

切面的內容可以復用,比如timehandler的printtime方法,任何地方需要列印方法執行前的時間與方法執行後的時間,都可以使用timehandler的printtime方法

避免使用proxy、cglib生成**,這方面的工作全部框架去實現,開發者可以專注於切面內容本身

**與**之間沒有耦合,如果攔截的方法有變化修改配置檔案即可

我們傳統的程式設計方式是垂直化的程式設計,即a–>b–>c–>d這麼下去,乙個邏輯完畢之後執行另外一段邏輯。但是aop提供了另外一種思路,它的作用是在業務邏輯不知情(即業務邏輯不需要做任何的改動)的情況下對業務**的功能進行增強,這種程式設計思想的使用場景有很多,例如事務提交、方法執行之前的許可權檢測、日誌列印、方法呼叫事件等等。

AOP程式設計

1.spring中的aop程式設計 1.1 spring中的aop的簡介 1.2 spring中的動態 cglib動態 1.3 spring中的aop的專業術語 1.4 spring中的aop的實現 1.4.1 傳統的springaop 乙個切點只能對應乙個通知1.4.2 基於aspectj的aop...

AOP程式設計思想

面向切面程式設計 這是最近接觸到的思想。看名字感覺很新奇,其實就是在底層實現攔截呼叫。通俗點,如果你不小心踩到狗屎,心理不平衡時,你可以在人人都會走過的路上放一坨狗屎,這樣,路過的人都會踩到狗屎。這樣你就實現了面向切面程式設計 個人理解 關鍵字 切面,攔截。用途 操作日誌,許可權驗證等。老規矩介面先...

AOP 切面程式設計

簡介 如果你很熟悉面向方面程式設計 aop 你就會知道給 增加 切面 可以使 更清晰並且具有可維護性。但是aop通常都依賴於第三方類庫或者硬編碼的.net特性來工作。雖然這些實現方式的好處大於它們的複雜程度,但是我仍然在尋找一種實現aop的更為簡單的方式,來試我的 更為清晰。我將它們單獨移出來,並命...