您的位置:首页 > 编程语言 > Java开发

Spring.NET学习笔记13——AOP的概念(基础篇)

2011-04-10 19:31 639 查看
  上篇我们简单的了解了[b]AOP[/b]的应用场景,知道[b]AOP[/b]编程的重要性。这篇我们先看一段代码,来开始今天的学习。

  回顾与上篇类似的代码: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);
}


实现部分

public class OrderService : IOrderService
{
public string UserName { get; set; }

public object Save(object id)
{
return "保存:" + id.ToString();
}
}


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;
}
}
}


客户端部分:
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

  通过上篇的学习,我们知道,什么是[b]AOP[/b]——面向切面的编程。在[b]AOP[/b](面向切面的编程)中,我们编写程序时,首先思考要对程序中哪些方法进行拦截,拦截到这些方法后又要做哪些业务处理。这些关注过程,我们称之为:横切性关注点。由“横切性关注点”引申出以下概念:

  Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。程序里的切面就是AroundAdvise类的实现部分。

  joinpoint(连接点):所谓连接点是指那些被拦截到的点。在Spring.NET中,连接点指的是方法,因为Spring.NET只支持方法类型的连接点,实际上joinpoint(连接点)还可以是字段或类构造器。程序里的连接点就是拦截到的方法,如OrderService类的Save方法。

  Pointcut(切入点):所谓切入点是指我们要对那些joinpoint(连接点)进行拦截的定义。程序里没有使用invocation.Method来判断拦截哪些方式,而[b]Pointcut(切入点)[/b]就是对所有方法进行拦截。

  Advice(通知):所谓通知是指拦截到joinpoint(连接点)之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,环绕通知。AroundAdvise继承AopAlliance.Intercept.IMethodInterceptor 接口,程序里使用的是环绕通知。

  Target(目标对象):代理的目标对象。程序里的目标对象就是OrderService类,我们通过

ProxyFactory factory = new ProxyFactory(new OrderService() { UserName = "admin" });

这句代码确定了目标对象是OrderService。

  [b]AOP代理[/b]([b]AOP proxy[/b]):由[b]AOP[/b]框架在将通知应用于目标对象后创建的对象。程序里通过GetProxy()方法创建出的代理对象。

  Weave(织入):指将切面(aspect)应用到目标对象(target)对象并导致代理(proxy)对象创建的过程称为织入。正如程序里所应用的,OrderService类不具备判断权限的功能,我们将判断权限的功能——SecurityService类的IsPass方法应用到目标对象的过程。

  Introduction(引入):在不修改类代码的前提下,Introduction(引入):可以在运行期为类动态地添加一些方法或字段。程序里在没有修改OrderService类,而是在运行期把判断权限的功能通过ProxyFactory的AddAdvice方法动态的增加进去。

  这些术语不属于Spring.NET,而属于整个[b]AOP[/b]编程。所谓[b]AOP[/b],我的理解就是应该是这样一个过程,首先需要定义一个切面,这个切面是一个类,里面的方法就是关注点(也是通知),或者说里面的方法就是用来在执行目标对象方法时需要执行的前置通知,后置通知,异常通知,最终通知,环绕通知等等。有了切面和通知,要应用到目标对象,就需要定义这些通知的切入点,换句话说就是需要对哪些方法进行拦截,而这些被拦截的方法就是连接点,所谓连接点也就是在动态执行过程,被织入切面的方法(至少在Spring.NET中只能对方法进行拦截)。因此,在动态过程中通知的执行就属于织入过程,而被织入这些通知的对象就是目标对象了。

  代码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: