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

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. json提交数据到服务端

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Courier New"; color: #393939; backgr ...

  2. Java链接MySQL练习题:格式化日期、性别;避免代码注入

    一.查询人员名单,按序号 姓名 性格(男或女) 民族(某族) 生日(年月日)输出 import java.sql.*; import java.text.SimpleDateFormat; publi ...

  3. log4jWARN Please initialize the log4j system properly解决办法

    原因是没有对log4j这个jar进行文件配置. 要解决这个问题非常简单,建立LOG4J 的配置文件即可.在src 目录下创建配置文件,选择菜单File > New > File,文件名输入 ...

  4. Pod(转)

    一.CocoaPods的安装 (1)使用淘宝的Ruby镜像替换官方的ruby源,在终端输入命令 $ gem sources --remove https://rubygems.org/ $ gem s ...

  5. easyui combobox 左匹配模糊查询

    之前一直不知道,easyui 的combobox还有从左匹配查询显示数据的. 样式是这样的:(这是数据是已经存在下拉列表里的) 在这样操作的时候,遇到了一个问题.(其实也不算问题的). 就是操作人员在 ...

  6. Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享

    架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要 ...

  7. mac下安装nginx+php+mysql+xdebug

    一,安装homebrew 就像linux下面有yum一样,mac也有个homebrew,管理软件非常便捷. 官网:http://brew.sh/index_zh-cn.html 上面有句命令,复制下来 ...

  8. c3p0连接池获得的Connection执行close方法后是否真的销毁Connection对象?

    问题描述: jfinal做的api系统中,在正常调用接口一段时间后,突然再调用接口的时候,该请求无响应api系统后台也无错误信息 (就是刚开始接口调用是正常的,突然就无响应了) 于是啊,就开始找错误. ...

  9. Spring的注解

    Action想使用serviceImpl时,都需要最原始的方法New一个接口,Service service = new serviceImpl();去实例化service了.都需要Action主动创 ...

  10. UDP的connect函数

    UDP的connect没有三次握手过程,内核只是检测是否存在立即可知的错误(如一个显然不可达的目的地), 记录对端的的IP地址和端口号,然后立即返回调用进程. 未连接UDP套接字(unconnecte ...