AOP是什么?

  面向切面编程,在OO中有一个开放关闭原则,及对修改关闭,对扩展开放。AOP可以说是设计模式的集合加强版,使用代理、工厂、策略等等模式,来实现方法的结合。
这样说还比较模糊,我们先往下看。

  AOP中常用的名词(这个先了解一下,最后再回来看就恍然大悟了):

  Pointcut(切入点):被拦截到的点。如:在保存数据的方法中加入日志的方法,那么保存数据的方法就是切入点。

  Advice(通知):指拦截之后所要做的事情就是通知。如上面例子,日志的方法就是通知。通知有4类,分别是前置通知,后置通知,异常通知,环绕通知。

  Target(目标对象):代理的目标对象。如上面例子,保存数据方法的对象。

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

spring.net中的AOP

  spring.net是一个依赖注入框架,这里就用它在AOP方面的功能,初步谈一下他的实现方法,进入AOP的世界。

  spring.net下载地址: http://www.springframework.net/

  我们使用记日志的例子来实现一个简单的AOP:

  创建一个控制台应用程序。

  1、申明一个保存数据的接口

  public interface IDataService
  {
      void SaveData();
  }

  2、实现一个保存数据的类

  namespace AOPDmo.SaveData
  {
      public class DataService : IDataService
      {
          public void SaveData()
          {
              Console.WriteLine("保存数据...");
          }
      }
  }

  3、一个记日志的类

    public class LogAdvice : IMethodInterceptor
    {
        private void Log()
        {
            Console.WriteLine("保存数据记日志");
        }

        public object Invoke(IMethodInvocation invocation)
        {
            //Log();
            object obj = invocation.Proceed();
            Log();
            //if (invocation.Method.Name == "") //用invocation.Method可以获取切入点的信息
            //{
            //    Log();
            //}
            return obj;
        }
    }

  记日志的类作为一个和业务无关的通知,在需要的时候调用。这里继承spring的IMethodInterceptor(环绕通知)接口来告诉框架这是一个方法拦截器,并实现接口的Invoke方法,invocation.Proceed()方法使程序执行DataService类的SaveData()方法。

  4、主页面,Program

    class Program
    {
        static void Main(string[] args)
        {
            ProxyFactory factory = new ProxyFactory(new DataService());
            factory.AddAdvice(new LogAdvice());
            IDataService service = (IDataService)factory.GetProxy();
            service.SaveData();
            Console.Read();
        }
    }

  在Program中我们做了三件事情,

  先告诉框架我们要对DataService做一个拦截器,用DataService作为目标对象,让框架创建一个代理工厂。

  然后告诉代理工厂我们的通知是LogAdvice(可以添加多个)。

  最后用代理工厂的方法factory.GetProxy()创建代理类。

  执行结果:

  

  到目前为止我们已经实现了一个简单的AOP记日志的功能,但是当我们不需要记日志了,那么就要删掉这里的代码,是不是感觉还不如直接写方法?

  接下来我们用配置的方式来解决这个问题。

使用配置

  创建一个xml文件

  <?xml version="1.0" encoding="utf-8" ?>
  <objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.net
         http://www.springframework.net/xsd/spring-objects.xsd">

  <object id="DataService" type="AOPDmo.DataService, AOPDmo"/>
  <object id="LogAdvice" type="AOPDmo.LogAdvice, AOPDmo"/>

  <object id="DataProxy" type="Spring.Aop.Framework.ProxyFactoryObject, Spring.Aop">
    <property name="ProxyInterfaces">
      <list>
        <value>AOPDmo.IDataService,AOPDmo</value>
      </list>
    </property>
    <property name="Target">
      <ref object="DataService" />
    </property>
    <property name="InterceptorNames">
      <list>
        <value>LogAdvice</value>
      </list>
    </property>
  </object>
</objects>

  头两个object是告诉框架创建代理类时所需的类名、所在程序集。

  第三个object是需要创建的代理类,property是属性。

  创建一个代理类同样需要做三件事:

  1、属性Target(目标对象),先告诉框架我们要对DataService做一个拦截器,用DataService作为目标对象。

  2、属性InterceptorNames(拦截器的名称),告诉代理工厂我们的通知是LogAdvice(可以添加多个)。

  3、属性ProxyInterfaces是告诉框架代理类要继承的接口,创建代理类。

  Program代码:

    class Program
    {
        static void Main(string[] args)
        {
            IApplicationContext context = new XmlApplicationContext(@"XMLFile1.xml");
            IDataService service = (IDataService)context.GetObject("DataProxy");
            service.SaveData();
            Console.Read();
        }
    }

  执行得到一样的结果,就不贴出来了。

  当我们不需要日志的时候,将配置文件的<value>LogAdvice</value>代码注释掉就可以,是不是方便多了。

AOP的应用

  我们在开发项目中,经常会遇到需要记录日志的地方,比如说机票系统中,机票做Update的时候,需要记录操作人是谁,什么时候修改的。比如监控我们系统中重要方法的执行,执行了多久,是否成功等等,主要应用在和业务无关,使用频率高的方法。

  这篇主要是用ProxyFactory来创建AOP代理,后面的笔记将继续写一篇关于配置方面的内容,使AOP得到更灵活的应用。

spring.net AOP初探的更多相关文章

  1. Spring入门(9)-AOP初探

    Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...

  2. spring源码学习之路---AOP初探(六)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,但当初打算学习 ...

  3. spring源码学习(一)--AOP初探

    LZ以前一直觉得,学习spring源码,起码要把人家的代码整体上通读一遍,现在想想这是很愚蠢的,spring作为一个应用平台,不是那么好研究透彻的,而且也不太可能有人把spring的源码全部清楚的过上 ...

  4. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  5. Spring实现AOP的4种方式

    了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“ ...

  6. spring的AOP

    最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spr ...

  7. Spring(五)AOP简述

    一.AOP简述 AOP全称是:aspect-oriented programming,它是面向切面编号的思想核心, AOP和OOP既面向对象的编程语言,不相冲突,它们是两个相辅相成的设计模式型 AOP ...

  8. Spring中AOP原理,源码学习笔记

    一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...

  9. Spring之AOP面向切片

       一.理论基础: AOP(Aspectoriented programming)面向切片/服务的编程,在Spring中使用最多的是对事物的处理.而AOP这种思想在程序中很多地方可以使用的,比如说, ...

随机推荐

  1. 【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等

    原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志 ...

  2. 收集的css布局

    1 <title>左定宽,右自动</title> 2 <style> 3 body{margin:0px;padding:0px;} 4 .box .left,.b ...

  3. Java中关于继承、类、多态、接口的知识点

    继承 含义:在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类 优点:1)代码的重用性:2)子类扩展父类的属性和方法:3)父类的属性和方法可用于子类:4)设计应用程序 ...

  4. c# WebBrowser开发参考资料

    原文:c# WebBrowser开发参考资料 c# WebBrowser开发参考资料,所有资料的采集均来自网上 话说有了WebBrowser类,终于不用自己手动封装SHDocVw的AxWebBrows ...

  5. C语言 ## __VA_ARGS__ 宏

    在GNU C中,宏可以接受可变数目的参数,就象函数一样 可以把__VA_ARGS__看成是将...赋值给该宏 //注意这里不能在函数中调用abc() #include <stdio.h> ...

  6. AngularJS应用开发思维之2:数据绑定

    在声明式模板中显示数据 因为不能像jQuery一样将DOM操作混在模板里,声明式模板很快让我们变得束手束脚. 一个典型的问题:在声明式模板里怎么显示数据? 假设我们有某人的基本信息,保存在一个json ...

  7. IOS开发中绘制地图线路

    地图应用经常会涉及到线路的绘制问题,ios下可以使用MKMapView进行地图开发,使用 MKOverlayView进行线路的绘制. 使用MKMapView添加MKMap.framework 和Cor ...

  8. IOS中TableView的使用(1) -创建一个简单的tableView

    创建一个简单的tableView: #import <UIKit/UIKit.h> /*tableView 一定要遵守这两个协议: UITableViewDataSource,UITabl ...

  9. Mac下一个/usr/include失踪

    Mac升级到Yosemite后,突然发现vim的YouCompleteMe代码提示所以空头支票成员,排查了一下,原本/usr/include目录中缺少.所有的C/C++头文件不见了. .. 第一次发现 ...

  10. View & ViewData

    ViewData 似乎没啥好说的,一个向 View 传送数据的字典. ----------------------------------------------------------------- ...