上篇我們簡單的瞭解了AOP的應用場景,知道AOP編程的重要性。這篇我們先看一段代碼,來開始今天的學習。
回顧與上篇類似的代碼:SecurityService類的IsPass判斷用戶名爲“admin”則有權限保存數據。OrderService爲保存數據的類,實現IOrderService接口。
實現部分
客戶端部分:
輸出: 保存:1
通過上篇的學習,我們知道,什麼是AOP——面向切面的編程。在AOP(面向切面的編程)中,我們編寫程序時,首先思考要對程序中哪些方法進行攔截,攔截到這些方法後又要做哪些業務處理。這些關注過程,我們稱之爲:橫切性關注點。由“橫切性關注點”引申出以下概念:
Aspect(切面):指橫切性關注點的抽象即爲切面,它與類相似,只是兩者的關注點不一樣,類是對物體特徵的抽象,而切面是橫切性關注點的抽象。程序裏的切面就是AroundAdvise類的實現部分。
joinpoint(連接點):所謂連接點是指那些被攔截到的點。在Spring.NET中,連接點指的是方法,因爲Spring.NET只支持方法類型的連接點,實際上joinpoint(連接點)還可以是字段或類構造器。程序裏的連接點就是攔截到的方法,如OrderService類的Save方法。
Pointcut(切入點):所謂切入點是指我們要對那些joinpoint(連接點)進行攔截的定義。程序裏沒有使用invocation.Method來判斷攔截哪些方式,而Pointcut(切入點)就是對所有方法進行攔截。
Advice(通知):所謂通知是指攔截到joinpoint(連接點)之後所要做的事情就是通知.通知分爲前置通知,後置通知,異常通知,環繞通知。AroundAdvise繼承AopAlliance.Intercept.IMethodInterceptor 接口,程序裏使用的是環繞通知。
Target(目標對象):代理的目標對象。程序裏的目標對象就是OrderService類,我們通過
ProxyFactory factory = new ProxyFactory(new OrderService() { UserName = "admin" });
這句代碼確定了目標對象是OrderService。
AOP代理(AOP proxy):由AOP框架在將通知應用於目標對象後創建的對象。程序裏通過GetProxy()方法創建出的代理對象。
Weave(織入):指將切面(aspect)應用到目標對象(target)對象並導致代理(proxy)對象創建的過程稱爲織入。正如程序裏所應用的,OrderService類不具備判斷權限的功能,我們將判斷權限的功能——SecurityService類的IsPass方法應用到目標對象的過程。
Introduction(引入):在不修改類代碼的前提下,Introduction(引入):可以在運行期爲類動態地添加一些方法或字段。程序裏在沒有修改OrderService類,而是在運行期把判斷權限的功能通過ProxyFactory的AddAdvice方法動態的增加進去。
這些術語不屬於Spring.NET,而屬於整個AOP編程。所謂AOP,我的理解就是應該是這樣一個過程,首先需要定義一個切面,這個切面是一個類,裏面的方法就是關注點(也是通知),或者說裏面的方法就是用來在執行目標對象方法時需要執行的前置通知,後置通知,異常通知,最終通知,環繞通知等等。有了切面和通知,要應用到目標對象,就需要定義這些通知的切入點,換句話說就是需要對哪些方法進行攔截,而這些被攔截的方法就是連接點,所謂連接點也就是在動態執行過程,被織入切面的方法(至少在Spring.NET中只能對方法進行攔截)。因此,在動態過程中通知的執行就屬於織入過程,而被織入這些通知的對象就是目標對象了。