(方面:如有错误,请勿喷,评论即可)

1.开始

什么是AOP?关于它的详细内容,可以自己用google搜索一下,能找到很多有趣的内容。事实上,现在的AOP只是对OOP的一个补充,还没有到达一个语言级别。 对于java世界里的AspectJ,我目测它的实现原理应该只是java的元编程(正如spring做的那样,只不过它提供了类似语法糖一样的东西,如果我理解错了,请java的同学们不要喷我)。

2.Spring

可以去下载它的最新版本,http://www.springsource.org/download/community  exe安装版

3.现学现卖

我先简单介绍一下AOP(参照第1条), aspect 意思可以有 切面、横面、方面或者侧面,维基百科上面写的是侧面。 如果把OOP看做纵向的编程(继承,方法调用等等),那么AOP就是横向的编程。

4.OOP举例

日志是一个很好的例子,有一个在AOP观点中很搓的实现(我敢说大部分人都是这么实现的),就是trycatch 一段程序,在catch里写日志调用的方法,如果还要记录info,可能在程序某个地方写 logger.info

public void SomeBusinessMethod(){
  logger.Info(".........");
  try{
    Operate();
  }catch(Exception e){
    logger.Error(e.Message);
  }
  finally{
    Hehe();
  }
  logger.info();
}

  

5.AOP的反驳

呵呵,如果业务逻辑中这样的方法有上百个(其实也不用上百个,30个即可),你这样一个一个去实现日志功能,我敢打赌你写到第10个就感到厌倦了——重复代码。也有人可能说,可以用一个Context实现,对于日志这个例子,也许能省掉trycatch语句块,但你还是得一便一遍的调用info error等方法。

也许在 ASP.NET中,你可以看见 Page.OnError方法 ,或者Controller.OnException方法来处理异常,Page.OnLoad ,Page.OnUnload,Controller.OnActionExecuting,Controller.OnActionExecuted方法,但这事实上已经有点AOP的味道了

是的,你可以在把方法调用前,方法返回后或者异常作为连接点,通过切入点指定这些连接点做什么(通知)

6.解决方案——Spring.NET

参照第2条,安装完Spring后,在开始菜单招到Spring.NET,然后打开AOP示例项目 (example)

Common项目包含了Aspects和Commands的几个类,ServiceCommand实现了ICommand的三个成员

把Step1 设为启动项目, 打开Program.cs, 可以看到它用了ProxyFactory代理了ServiceCommand,然后给它增加了三个方面并创建了代理对象,最后调用代理对象的三个方法。详细代码可以在示例项目中找到。 注释表明了,这是一个programmatically (编程实现AOP)

// Create AOP proxy programmatically.
                ProxyFactory factory = new ProxyFactory(new ServiceCommand());
                factory.AddAdvice(new ConsoleLoggingBeforeAdvice());
                factory.AddAdvice(new ConsoleLoggingAfterAdvice());
                factory.AddAdvice(new ConsoleLoggingThrowsAdvice());
                ICommand command = (ICommand)factory.GetProxy();

                command.Execute();
                if (command.IsUndoCapable)
                {
                    command.UnExecute();
                }

  

截图如下(为了醒目起见,我加了点分隔线)

这样就为每个方法的前与后动态地添加了行为,这些行为就是通知(Advise)。

结合日志的例子,我们就可以很方便的为每个业务方法加上这些Advise,然后做日志操作,事实上示例项目做的就是日志。

可以看到有很多Advise——Before,After,Around(环绕)和ThrowAdvise

Spring.NET 与 AOP 初窥1的更多相关文章

  1. SSM-Spring-08:Spring的静态代理初窥案例

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 静态代理 java的设计模式的代理模式,就是静态代理 写在前面的话,静态代理的优点和缺点 优点:可以在不改变一 ...

  2. 初窥ElasticSearch

    初窥ElasticSearch 官网上面的,不知道讲的是什么.. youtube上面有一个start with,内容是在windows以下跑这个elastic search,然后用一个fidler工具 ...

  3. Spring Boot2(六):使用Spring Boot整合AOP面向切面编程

    一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop ​ aop全称Aspec ...

  4. Spring 3.0 AOP (一)AOP 术语

    关于AOP.之前我已写过一个系列的随笔: <自己实现简单的AOP>,它的关注点在于实现.实现语言是C#,实现方式为 自定义实现 RealProxy 抽象类.重写Invoke方法,以便进行方 ...

  5. Spring系列之AOP实现的两种方式

    AOP常用的实现方式有两种,一种是采用声明的方式来实现(基于XML),一种是采用注解的方式来实现(基于AspectJ). 首先复习下AOP中一些比较重要的概念: Joinpoint(连接点):程序执行 ...

  6. Scrapy001-框架初窥

    Scrapy001-框架初窥 @(Spider)[POSTS] 1.Scrapy简介 Scrapy是一个应用于抓取.提取.处理.存储等网站数据的框架(类似Django). 应用: 数据挖掘 信息处理 ...

  7. 初窥Kaggle竞赛

    初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...

  8. scrapy2_初窥Scrapy

    递归知识:oop,xpath,jsp,items,pipline等专业网络知识,初级水平并不是很scrapy,可以从简单模块自己写. 初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数 ...

  9. WWDC15 Session笔记 - Xcode 7 UI 测试初窥

    https://onevcat.com/2015/09/ui-testing/ WWDC15 Session笔记 - Xcode 7 UI 测试初窥 Unit Test 在 iOS 开发中已经有足够多 ...

随机推荐

  1. Object-C

    #import <Foundation/Foundation.h> #pragma mark 狗类的声明 @interface Dog:NSObject { @public NSStrin ...

  2. 求两条直线相交点 AS3代码

    ,); ,); ,); ,); var p:Point = new Point(); trace(checkPoint()) function checkPoint() { if (p1Start.x ...

  3. 搞清css的单位 px,em,rem的区别

    前言:现在上大街一眼望去,基本上90%的人都拿着手机,走路,逛街,吃东西都不停着,所以对于我们这种前端开发的程序猿来说,让网页适应于移动端可以说是必须要满足的.所以最近也是一直在学习和实践.然后就接触 ...

  4. 根据标记清空页面中所有的input对象

    function clear1(flag) { //获取页面中所有的input对象 var inputs = document.getElementsByTagName("input&quo ...

  5. TOEFL备考计划

    一.总则: 1.坚持每一天,充分利用一切可以利用的时间学英语.没有持之以恒的学习和大量的时将做保障,一切都是空谈. 2.每天听写一篇文章,以此文章为中心,展开一天的学习. OG, TOP 3.听说读写 ...

  6. Linux内核创建一个新进程

    张雨梅   原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 创建新进程 如果同一个程序被多 ...

  7. Node.js 基础库

    全局对象 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global对象的属性. 我们在 Node.js 中能够直接访问到对象通常都是 global ...

  8. File API 读取上传的文件

    1, 在html 文档中,<input type="file"> 我们可以选择文件进行上传,但这时只能上传一个文件.如果加上multiple 属性,可以上传多个文件,上 ...

  9. (十七)linux网络命令 vconfig ifconfig

    增删VLAN    vconfig add eth0 10    vconfig rem eth0.10重启网卡    ifconfig eth0.101 up    ifconfig eth0.10 ...

  10. Android Intent

    Intent在Android中的重要性不言而喻.本文主要总结下Intent使用过程中需要注意的一些问题. 1.隐式Intent AndroidManifest.xml声明时<intent-fil ...