AOP是什么

AOP为Aspect Oriented Programming的缩写。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

详情请自行百度或者Google: AOP In  .Net 的应用

 

AOP的应用场景

AOP的最大优势是,你只需要担心方面在一个地方,编程一次和应用所需的所有地方。AOP有很多用途,例如:

  • 日志(Logging):在应用程序中实现日志记录
  • Authentication(身份校验):使用身份验证之前的操作(如允许一些操作只有通过身份验证的用户)。
  • 数据校验(Validation or Notificatio):实施验证或通知属性setter(调用propertychange事件当属性已经改变了类,实现INotifyPropertyChanged接口)。
  • 行为改变(Changing the behavior):改变一些方法的行为。

如您所见,AOP有许多用途,但是你必须小心使用它。它将保留一些代码在你的视线范围之内,但它鈥檚仍然存在,在每次调用运行方面存在的地方。它可以有缺陷和严重影响应用程序的性能。一个微妙的错误可能花费你很多方面的调试时间。如果你的方面是鈥檛使用在许多地方,有时候鈥檚最好直接将它添加到代码。

AOP实现使用一些常见的技巧:

  • 添加预处理程序源代码中使用,如在c++中。
  • 使用后处理器添加指令编译后的二进制代码。
  • 使用一种特殊的编译器编译时添加代码。
  • 使用一个代码在运行时拦截器,拦截执行并添加所需的代码。

在.Net框架,其中最常用的技术是后处理和代码拦截。前者所使用的技术是PostSharp(postsharp.net),后者使用依赖注入(DI)容器,如Castle DynamicProxy(bit . ly / JzE631)和Unity (unity.codeplex.com)。这些工具(指依赖注入容器)通常使用 装饰者设计模式 代理 执行代码拦截

应用AOP的优点和缺点

AOP的最大优势是,你只需要担心方面在一个地方,编程一次和应用所需的所有地方。AOP有很多用途,例如:

  • 在应用程序中实现日志记录。
  • 使用身份验证之前的操作(如允许一些操作只有通过身份验证的用户)。
  • 实施验证或通知属性setter(调用propertychange事件当属性已经改变了类,实现INotifyPropertyChanged接口)。
  • 改变一些方法的行为。

如您所见,AOP很有用,但是你必须小心使用它。尽管AOP代码实现在不用的类里,,在每次调用运行时AOP都存在于相应的地方。它可能有缺陷,也有可能严重影响应用程序的性能。一个细小的切面Bug可能花费你太多的调试时间。如果你的AOP是至少使用在某一处的时候,最好直接将它添加到代码。

AOP实现使用一些常见的技巧:

  • 添加预处理程序源代码中使用,如在c++中。
  • 使用后处理器添加指令编译后的二进制代码。
  • 使用一种特殊的编译器编译时添加代码。
  • 使用一个代码在运行时拦截器,拦截执行并添加所需的代码。

在。净框架,其中最常用的技术是后处理和代码拦截。前者是PostSharp所使用的技术(postsharp.net),后者使用依赖注入(DI)容器,如城堡了DynamicProxy(bit . ly / JzE631)和统一(unity.codeplex.com)。这些工具通常使用一个叫装饰的设计模式或代理执行代码拦截。

知识延伸=》装饰设计模式

装饰设计模式解决了一个常见的问题:你有一个类和想要添加一些功能。你有几个选择:

  • 你可以直接向类添加新的功能。然而,这个类不止一个职责,同时也不符合“单一职责”原则。
  • 你可以创建一个新类,让这个功能去调用它旧类的对应方法。但是,这会带来一个新问题:如果你还想使用没有新功能的类,将会怎样?
  • 你可以创建一个新类,让新类继承旧类,添加新的功能,但这可能导致许多新类。例如,也就是说你有一个存储库类创建、读取、更新和删除(CRUD)数据库操作和您想要添加审计。然后,您想要添加数据验证来确保数据被正确更新。再之后,您可能还希望验证访问,以确保只有授权用户可以访问的类。这些都是大问题:你可以有一些类,实现三个方面,或者实现其中两方面,甚至只有其中一方面。最后你将会有多少类?
  • 你可以用外包装来来修饰这些类,创建一个具有切面功能的新类,然后调用旧类。这样,如果你需要一个方面,你包裹它一次。两个方面,你包装两次,等等等。比如说你订购一个玩具(正如我们是极客,Xbox或智能手机)。首先它需要一个具有足够大空间和保护功能的最外层的包装。然后,对于第2层包装,您可以订购一个磁带润,条纹、卡片和礼物纸的盒子。第3层包装,一个由具有防易碎功能的聚苯乙烯泡沫塑料球包裹它。现在他有三层外包装,每一个外包装有不同的功能,且每一外包装都彼此独立。你可以买一个没有礼品包装盒,甚至没有任何包装玩具(特别不折扣!)。你可以按照你的想法任意组合去包装你玩具,但是他们并不改变玩具所具有的功能

AOP参考

本文翻译自 :https://msdn.microsoft.com/en-us/magazine/dn574804.aspx(面向切面编程)

AOP(面向切面编程概念,本文为翻译)的更多相关文章

  1. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...

  2. [转] AOP面向切面编程

    AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  3. 【原创】Android AOP面向切面编程AspectJ

    一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...

  4. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

  5. 论AOP面向切面编程思想

    原创: eleven 原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg [前言] AOP(Aspect-Oriented Programming ...

  6. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

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

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

  8. 详细解读 Spring AOP 面向切面编程(二)

    本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...

  9. 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

    简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...

  10. Z从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    本文梯子 本文3.0版本文章 代码已上传Github+Gitee,文末有地址 大神反馈: 零.今天完成的深红色部分 一.AOP 之 实现日志记录(服务层) 1.定义服务接口与实现类 2.在API层中添 ...

随机推荐

  1. Go语言 进程、线程、轻量级进程、协程和go中的Goroutine 那些事儿

    原文:http://www.cnblogs.com/shenguanpu/archive/2013/05/05/3060616.html 电话面试被问到go的协程,曾经的军伟也问到过我协程.虽然用py ...

  2. IOS-Alcatraz(插件管理工具)

    一.简单说明 Alcatraz 是一款 Xcode的插件管理工具,可以用来管理XCode的 插件.模版以及颜色配置的工具. 二.如何安装 1.github地址:https://github.com/a ...

  3. IE浏览器兼容 css之bug 问题

    bug的几种常见原因: 1.盒模型bug      原因:没有正确声明doctype(如果没有声明doctype,各浏览器对代码的解析有不同的规范).解决方法:使用严格的doctype声明. 2.各浏 ...

  4. 【MAVEN】笔记

    引言 Maven是Java项目开发中的重要组成部分,了解它学习它是我们的必修课. Maven是什么? Maven是一个项目管理和综合工具.Maven是标准化的产物,使用标准的目录结构和默认构建生命周期 ...

  5. Intent Flag启动模式P203

    Activity启动模式:点此查看 Intent intent = new Intent(); /** * Intent.FLAG_ACTIVITY_NEW_TASK * 使用一个新的Task来启动一 ...

  6. 几种常见排序算法的C++描述

    基本的排序算法有如下特点: 1.几种容易的算法都是以O(N2)排序的 2.Shell排序编程简单,其也是以O(N2)排序的,在实践中用的很多 3.复杂的排序算法往往都是按照O(NlogN)尽心排序的 ...

  7. CSS:Tutorial three

    1.CSS Links links can be styled differently depending on what state they are in. The four links stat ...

  8. Python基础学习(第6天)

    1.zip函数 1)zip函数在只有一个参数时运作的方式. x = [1, 2, 3] x = zip(x) print x输出:[(1,), (2,), (3,)] 2)zip函数在没有参数时运作的 ...

  9. Java 面试/笔试题神整理 [Java web and android]

    Java 面试/笔试题神整理 一.Java web 相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并 ...

  10. 浅析Java基本数据类型

    作为一种强类型语言,Java针对每一种数据都定义了明确的数据类型.大体来讲可分为:基本数据类型和引用数据类型:在此,主要讨论前者,后者以后再继续探究. Java基本数据类型分为四类八种: 1: 整数 ...