zoukankan      html  css  js  c++  java
  • 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中只能对方法进行拦截)。因此,在动态过程中通知的执行就属于织入过程,而被织入这些通知的对象就是目标对象了。

  • 相关阅读:
    面试题25二叉树中和为某一值得路径+递归函数详细解析
    [Codeforces 1199D]Welfare State(线段树)
    [Codeforces 1199C]MP3(离散化+二分答案)
    [Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论)
    [Codeforces 639F] Bear and Chemistry (Tarjan+虚树)(有详细注释)
    [HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP)
    [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)
    [Codeforces722E] Research Rover (dp+组合数学)
    [POJ3612] Telephone Wire(暴力dp+剪枝)
    [Codeforces600E] Lomsat gelral(树上启发式合并)
  • 原文地址:https://www.cnblogs.com/millen/p/1635966.html
Copyright © 2011-2022 走看看