Spring.NET教程(十三)AOP的概念(基礎篇)
上篇我們簡單的了解了AOP的應用場景,知道AOP編程的重要性。這篇我們先看一段代碼,來開始今天的學習。
回顧與上篇類似的代碼:SecurityService類的IsPass判斷用戶名為“admin”則有權限保存數據。OrderService為保存數據的類,實現IOrderService接口。
public class SecurityService
{
public bool IsPass(string userName)
{
return userName == "admin";
}
}
public interface IOrderService
{
string UserName { get; set; }
object Save(object id);
}
實現部分
OrderService
public class OrderService : IOrderService
{
public string UserName { get; set; }
public object Save(object id)
{
return "保存:" + id.ToString();
}
}
AroundAdvise
public class AroundAdvise : IMethodInterceptor
{
public object Invoke(IMethodInvocation invocation)
{
IOrderService target = (IOrderService)invocation.Target;
SecurityService manager = new SecurityService();
if (manager.IsPass(target.UserName))
{
return invocation.Proceed();
}
else
{
return null;
}
}
}
客戶端部分:
Program
class Program
{
static void Main(string[] args)
{
ProxyFactory factory = new ProxyFactory(new OrderService() { UserName = "admin" });
factory.AddAdvice(new AroundAdvise());
IOrderService service = (IOrderService)factory.GetProxy();
object result = service.Save(1);
Console.WriteLine(result);
Console.ReadLine();
}
}
輸出:保存: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中只能對方法進行攔截)。因此,在動態過程中通知的執行就屬於織入過程,而被織入這些通知的對象就是目標對象了。
Spring.NET教程(十三)AOP的概念(基礎篇)