也说AOP

前言

1.引言

2.Aop概念

3.Aop实践

4.总结

一、引言

对于初入行的小白来讲,aop,ioc这两个程序设计思想总是傻傻分不清,不知道是个什么东东?别人再一谈各种框架更是云里雾里。。。博主今天带大家且先入个门,哈哈;)

二、Aop概念

AOP为Aspect Oriented Programming的缩写,译为:面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

三、Aop实践

在开发中,相信大家都遇到过验证用户权限的事情,那是不是需要在每个界面上都要加个判断呢?假如通过验证,就执行某某业务逻辑,不通过,就跳转或者提示啊 怎么怎么样。。。

              示图一

从程序设计的角度来考虑,验证用户 这件事情我们是不是可以分离出去呢,因为都是相同的嘛,减少重复,也是在不修改源代码的情况下动态统一添加功能;另一个方面可以 让一个对象尽可能的多关注自己的业务逻辑。这对于建立一个松耦合、可复用、可扩展性的系统是非常有利的。

下面介绍静态代理和动态代理实现AOP。(IL编织实现AOP这篇暂时先不介绍。。。)

创建公用的Model类

    public class User
    {
         public int Age { get; set; }
         public string Name { get; set; }
    }

代理模式 实现静态代理

     //代理模式  实现静态代理
    class DecoratorAop
    {
        public static void Show()
        {
            User user = new User
            {
                Age = 3,
                Name = "Michael"
            };
            IUserProcesser processer = new UserProcesser();
            processer.RegUser(user);
            IUserProcesser userProcesser = new UserProcesserDecorator(processer);
            userProcesser.RegUser(user);
        }
        public interface IUserProcesser
        {
            void RegUser(User user);
        }
        public class UserProcesser : IUserProcesser
        {
            public void RegUser(User user)
            {
                Console.WriteLine($"注册用户,年龄为{user.Age},姓名{user.Name}");
            }
        }
        public class UserProcesserDecorator : IUserProcesser
        {
            public IUserProcesser userProcesser;

            public UserProcesserDecorator(IUserProcesser processer)
            {
                userProcesser = processer;
            }
            public void RegUser(User user)
            {
                BeforeProcess();
                Console.WriteLine($"注册用户,年龄为{user.Age},姓名{user.Name}");
                AfterProcess();
            }
            public void BeforeProcess()
            {
                Console.WriteLine("方法执行前");
            }
            public void AfterProcess()
            {
                Console.WriteLine("方法执行后");
            }
        }

    }
     class Program
    {
        static void Main(string[] args)
        {
            DecoratorAop.Show();
            Console.ReadLine();
        }
    }

使用.NET Remoting/RealProxy 实现动态代理

     class ProxyAop
    {
        public static void Show()
        {
            User user = new User
            {
                Age = 3,
                Name = "Michael"
            };
            UserProcessor userProcessor = TransparentProxy.Create<UserProcessor>();
            userProcessor.RegUser(user);

        }
        /// <summary>
        /// 真实代理
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class MyRealProxy<T> : RealProxy
        {
            private T tTarget;
            public MyRealProxy(T target)
                :base(typeof(T))
            {
                tTarget = target;
            }

            public override IMessage Invoke(IMessage msg)
            {
                BeforeProcess();
                IMethodCallMessage methodCallMessage = (IMethodCallMessage)msg;
                object returnValue= methodCallMessage.MethodBase.Invoke(this.tTarget, methodCallMessage.Args);
                AfterProcess();
                return new ReturnMessage(returnValue,new object[0],0,null, methodCallMessage);
            }
            public void BeforeProcess()
            {
                Console.WriteLine("方法执行前");
            }
            public void AfterProcess()
            {
                Console.WriteLine("方法执行后");
            }
        }
        /// <summary>
        /// 透明代理
        /// </summary>
        public static class TransparentProxy
        {
            public static T Create<T>()
            {
                T instance=  Activator.CreateInstance<T>();
                MyRealProxy<T> myRealProxy = new MyRealProxy<T>(instance);
                T transparentProxy= (T)myRealProxy.GetTransparentProxy();
                return transparentProxy;
            }
        }
        public interface IUserProcessor
        {
            void RegUser(User user);
        }
        public class UserProcessor :MarshalByRefObject, IUserProcessor
        {
            public void RegUser(User user)
            {
                Console.WriteLine($"用户已注册,年龄{user.Age},姓名{user.Name}");
            }
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            ProxyAop.Show();
            Console.ReadLine();
        }
    }

使用Castle\DynamicProxy 实现动态代理

    public class CastleProxyAop
    {
        public static void Show()
        {
            User user = new User
            {
                Age = 3,
                Name = "Michael"
            };
            ProxyGenerator proxyGenerator = new ProxyGenerator();
            MyInterceptor myInterceptor = new MyInterceptor();
            UserProcessor userProcessor= proxyGenerator.CreateClassProxy<UserProcessor>(myInterceptor);
            userProcessor.RegUser(user);
            userProcessor.GetID();
        }
        public interface IUserProcessor
        {
             void RegUser(User user);
            void GetID();
        }
        public class UserProcessor : IUserProcessor
        {
            public virtual void RegUser(User user)
            {
                Console.WriteLine($"用户已注册,年龄{user.Age},姓名{user.Name}");
            }
            public virtual void GetID()
            {
                Console.WriteLine($"这是1");
            }
        }
        public class MyInterceptor : IInterceptor
        {
            public void Intercept(IInvocation invocation)
            {
                PreProceed();
                invocation.Proceed();
                PostProceed();
            }
            public void PreProceed()
            {
                Console.WriteLine($"方法执行前");
            }
            public void PostProceed()
            {
                Console.WriteLine($"方法执行后");
            }
        }

    }
     class Program
    {
        static void Main(string[] args)
        {
            CastleProxyAop.Show();
            Console.ReadLine();
        }
    }

使用Entlib\PLAB Unity实现动态代理

     public class UnityAop
    {
        public static void Show()
        {
            User user = new User
            {
                Age = 3,
                Name = "Michael"
            };
            IUnityContainer unityContainer = new UnityContainer(); //声明一个容器
            unityContainer.RegisterType<IUserProcessor, UserProcessor>(); //声明unityContainer并注册IUserProcessor

            unityContainer.AddNewExtension<Interception>().Configure<Interception>()
                .SetInterceptorFor<IUserProcessor>(new InterfaceInterceptor());
            IUserProcessor userProcessor = unityContainer.Resolve<IUserProcessor>();
            userProcessor.RegUser(user);
        }

        #region //特性对应的行为
        public class UserHandler : ICallHandler
        {
            public int Order { get; set; }

            public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
            {

                User user = input.Inputs[0] as User;
                if(user.Age<1)
                {
                    return input.CreateExceptionMethodReturn(new Exception("年龄小于1岁禁止入内"));
                }
                Console.WriteLine($"参数检测无误");
                IMethodReturn methodReturn = getNext()(input, getNext);
                return methodReturn;
            }
        }

        public class LogHandler : ICallHandler
        {
            public int Order { get; set; }

            public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
            {

                User user = input.Inputs[0] as User;
                string message = $"年龄{user.Age},姓名{user.Name}";
                Console.WriteLine($"日志已记录,message:{message},time:{DateTime.Now}");
                return getNext()(input, getNext);
            }
        }

        public class ExceptionHandler : ICallHandler
        {
            public int Order { get; set; }

            public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
            {
                IMethodReturn methodReturn = getNext()(input, getNext);
                if(methodReturn.Exception==null)
                {
                    Console.WriteLine("无异常");
                }
                else
                {
                    Console.WriteLine($"异常:{methodReturn.Exception.Message}");
                }
                return methodReturn;
            }
        }
        #endregion

        #region //特性
        public class UserHandlerAttribute : HandlerAttribute
        {
            public override ICallHandler CreateHandler(IUnityContainer container)
            {
                ICallHandler callHandler = new UserHandler { Order = this.Order };
                return callHandler;
            }
        }
        public class LogHandlerAttribute : HandlerAttribute
        {
            public override ICallHandler CreateHandler(IUnityContainer container)
            {
                return new LogHandler { Order = this.Order };
            }
        }
        public class ExceptionHandlerAttribute : HandlerAttribute
        {
            public override ICallHandler CreateHandler(IUnityContainer container)
            {
                ICallHandler callHandler = new ExceptionHandler { Order = this.Order };
                return callHandler;
            }
        }
        #endregion

        #region //业务
        [ExceptionHandlerAttribute(Order =3)]
        [LogHandlerAttribute(Order =2)]
        [UserHandlerAttribute(Order =1)]
        public interface IUserProcessor
        {
            void RegUser(User user);
        }
        public class UserProcessor : IUserProcessor
        {
            public void RegUser(User user)
            {
                Console.WriteLine($"用户已注册,年龄{user.Age},姓名{user.Name}");
            }
        }
        #endregion
    }
     class Program
    {
        static void Main(string[] args)
        {
            UnityAop.Show();
            Console.ReadLine();
        }
    }

四、总结

AOP的优点:

1.解耦,将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑中分离出去,当这些行为改变时不影响业务逻辑。

2.将通用功能从业务逻辑中抽离出来,提高代码复用性,灵活性,可扩展性。

AOP与OOP的区别:

OOP讲究“一切皆为对象”,使用类将世间万事万物的状态和行为模块化,封装继承多态。

AOP是将切面(Aspect)模块化。纵向切入,对业务处理过程中的切面进行提取,以获得逻辑过程中各部分之间低耦合的隔离效果,使应用对象更加关注业务逻辑,实现解耦,提供程序灵活性及可扩展性。

适用场景:日志记录,性能统计,安全控制,事务处理,异常处理。

参考:

http://www.cnblogs.com/landeanfen/p/4782370.html

http://www.cnblogs.com/jin-yuan/p/3811077.html

http://wayfarer.cnblogs.com/articles/241024.html

原文地址:https://www.cnblogs.com/jdzhang/p/8338461.html

时间: 2024-10-09 22:39:45

也说AOP的相关文章

Spring框架之Spring AOP

一.基于注解管理的AOP 1.Spring配置文件 <!-- 配置自动扫描包,自动扫描Bean组件,切面类 --> <context:component-scan base-package="com.zhoujian.spring.anno,com.zhoujian.spring.test"> <!-- <context:include-filter type="annotation" expression="org.a

Spring AOP中pointcut expression表达式解析 及匹配多个条件

Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. args() @args() execution() this() target() @target() within() @within() @annotation 其中 execution 是用的最多的,其格式为: execution(modifiers-pat

Spring AOP(面向切面示例)

什么是AOP?基本概念切面(aspect):横切关注点被模块化的特殊对象.通知(advice):切面必须要完成的工作.切面中的每个方向称之为通知.通知是在切面对象中的.目标(target):被通知的对象.代理(proxy):向目标对象应用通知后创建的对象. 连接点(joinpoint):目标对象的程序执行的某个特定位置.如某个方法调用前,调用后的位置.包括两个信息:1.目标程序的哪个方法?2.方法执行 前还是执行后?切点(pointcut):每个类会有多个连接点,AOP通过切点定位到特定的边接点

Spring AOP之Introduction(@DeclareParents)简介

Spring的文档上对Introduction这个概念和相关的注解@DeclareParents作了如下介绍: Introductions (known as inter-type declarations in AspectJ) enable an aspect to declare that advised objects implement a given interface, and to provide an implementation of that interface on be

3、Spring的AOP详解和案例

AOP(Aspect Oriented Programming),即面向切面编程. 1.OOP回顾 在介绍AOP之前先来回顾一下大家都比较熟悉的OOP(Object Oriented Programming).OOP主要是为了实现编程的重用性.灵活性和扩展性.它的几个特征分别是继承.封装.多态和抽象.OOP重点体现在编程架构,强调的是类之间的层次关系. 2.OOP缺陷 为了更好的说明OOP的概念,我们接下来讲一个OOP的实例,重点分析OOP存在哪些缺陷,以便更好的理解AOP的相关内容. 先看如下

spring aop 原理

http://blog.csdn.net/moreevan/article/details/11977115 Spring AOP 实现原理 2013-09-24 15:23 79554人阅读 评论(11) 收藏 举报  分类: spring(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)

Spring AOP进行日志记录

在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个方法的调用.然后进行日志记录.使用过滤器的好处是可以自己选择性的对某一些方法进行过滤,记录日志.但是实现起来有点麻烦. 另外一种就是使用Spring的AOP了.这种方式实现起来非常简单,只要配置一下配置文件就可以了.可是这种方式会拦截下所有的对action的每个操作.使得效率比较低.不过想做详细日志

手把手教你写个AOP框架

Why AOP? AOP(Aspect-Oriented Programming),意思是面向切面编程.传统的OOP面向对象相当于站在一个上帝模式从上往下看,里面的一块块都是一个对象,由我任意组合:而AOP不同之处在于,他是以一个旁观者的身法,从"侧面"看整个系统模块,看看哪里可以见缝插针,将自己想要处理的一段义务逻辑编制进去. Code duplication is the ultimate code smell. It's a sign that something is very

使用方法拦截器MethodInterceptor和AOP统一处理log

对每个接口的请求记录log的方法有很多种,比如用filter.mvc interceptor.method interceptor等.如果需要记录请求消息的payload,前两种不适用.下面介绍第三种的实现方法. 第一步:引入包依赖 <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name=&

Spring ——AOP

AOP是OOP的延续,是软件开发中的一个热点. AOP技术,是OOP补充.OOP引入封装,继承和多态建立一种对象层次结构模拟公共行为集合,而对从左到右的关系则显得无能为力.对于AOP则恰恰适应这种横切技术. 简单说,就与业务无关,却为了业务模块所共同调用的逻辑封装起来,便于减少系统重复代码,降低模块间耦合度,利用维护和可操作性 横切技术将软分为两部分:核心关注点和横切关注点:业务处理流程为核心关注,与之关系不大的是横切关注.如:系统中各处都相似的日志,事务,权限成为横切关注点.AOP作用是将核心