这只是一篇入门理解!

一直听说AOP的名字,却从未使用过,因为我不会。但……那只是曾经……

先看官方解释:AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它是一种新的方法论,它是对传统OOP编程的一种补充。OOP是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系;AOP是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即可。AOP是使用切面(aspect)将横切关注点模块化,OOP是使用类将状态和行为模块化。在OOP的世界中,程序都是通过类和接口组织的,使用它们实现程序的核心业务逻辑是十分合适。但是对于实现横切关注点(跨越应用程序多个模块的功能需求)则十分吃力,比如日志记录,权限验证,异常拦截等。

看完是不是很迷?不懂的人看不懂,懂得人不用看。

当我明白什么是面向切面后,我想到了一个故事——横切的苹果(这里不讲故事内容)。我们大多数人都是切苹果的方式,和我们的代码排版是一样的--竖的。就像这样:

public void Test1()
{
console.writeline("执行前日志");
do();
console.writeline("执行后日志");
}
public void Test2()
{
console.writeline("执行前日志");
do();
console.writeline("执行后日志");
}
public void Test3()
{
console.writeline("执行前日志");
do();
console.writeline("执行后日志");
}

但是总会有人去横着切苹果,然后发现了苹果里的五角星(现在苹果贵,网图凑合一下):

我们把代码也横排版一下:

public void Test1()        public void Test1()    public void Test1()
{ { {
console.writeline("前");console.writeline("前");console.writeline("前")
do(); do(); do();
console.writeline("后");console.writeline("后");console.writeline("后")
} } }

会发现出现大量重复的功能性代码(日志、验证等)出现在代码里,AOP就是把这些函数里可统一、可通用的代码都抽离出来,统一调用,统一修改,避免了每次修改这些代码时,大量重复的修改工作以及一些没必要的BUG,这就是面向切面。

一切不写demo的博客都是耍流氓!

这里用Postsharp来写demo,先去官网https://www.postsharp.net/下载一个安装包,申请免费许可证书,然后安装即可。

先把需要抽离的代码写在一个类里,上面的代码用writeline代替写日志,do()代替各自不同的业务代码。

[Serializable]
public class TestAopAspect : OnMethodBoundaryAspect
{//必须是Serializable 必须继承 OnMethodBoundaryAspect //执行前 可验证参数 或执行前日志等
public override void OnEntry(MethodExecutionArgs args)
{
Console.WriteLine($"{args.Arguments[0]}执行前");
}
//成功执行后
public override void OnSuccess(MethodExecutionArgs args)
{
Console.WriteLine($"{args.Arguments[0]}执行后");
}
}

然后写实现方法:

static void Main(string[] args)
{
Test1("Test1");
Test2("Test2");
Test3("Test3");
Console.ReadKey();
}
[TestAopAspect]
static void Test1(string msg)
{
Do(msg);
}
[TestAopAspect]
static void Test2(string msg)
{
Do(msg);
}
[TestAopAspect]
static void Test3(string msg)
{
Do(msg);//只有业务代码,没有写重复的功能代码
}
static void Do(string msg)
{
Console.WriteLine($"{msg},我就是我,不一样的烟火!");
}

看看执行结果:

//如果后续对日志内容或者验证做变更,也不需要在所有的Test方法里做修改,只需要在TestAopAspect里修改即可。

怎么能不反编译一下,看看发生了什么呢?

原来是postsharp在编译时替我们写了那些代码,至于专业术语,他们说是编织就是编织咯。

我说AOP(面向切面编程)--藏在苹果里的五角星的更多相关文章

  1. 谈一谈AOP面向切面编程

    AOP是什么 : AOP面向切面编程他是一种编程思想,是指在程序运行期间,将某段代码动态的切入到指定方法的指定位置,将这种编程方式称为面向切面编程 AOP使用场景 : 日志 事务 使用AOP的好处是: ...

  2. AOP 面向切面编程, Attribute在项目中的应用

    一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...

  3. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

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

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

  5. Method Swizzling和AOP(面向切面编程)实践

    Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...

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

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

  7. C# AOP 面向切面编程之 调用拦截

    有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...

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

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

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

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

随机推荐

  1. 试着给VuePress添加登录授权支持,基于v-dialogs

    背景介绍 VuePress是个不错的能基于Markdown快速构建静态网站的框架,初步来说,对外访问都是透明的. 但是可能因为一些保密需要,有些站点的文档,我们希望控制一下访问,所以我们借着别人的轮子 ...

  2. 『无为则无心』Python序列 — 18、Python列表概念及常用操作API

    目录 1.列表的概念 (1)列表的定义 (2)列表的应用场景 (3)列表的定义格式 2.列表的常用操作 (1)列表的查找 1)通过下标查找 2)通过方法查找 3)判断是否存在 (2)列表的增加 @1. ...

  3. 生产环境部署Django项目

    生产环境部署Django项目 1.  部署架构 IP地址 安装服务 172.16.1.251 nginx uwsgi(sock方式) docker mysql5.7 redis5 Nginx 前端We ...

  4. AcWing 829. 模拟队列

    实现一个队列,队列初始为空,支持四种操作: (1) "push x" – 向队尾插入一个数x: (2) "pop" – 从队头弹出一个数: (3) " ...

  5. 创建Maven项目骨架并使用

    1.archetype是什么? archetype 字面意思是 原型.可以理解为archetype相当于一个脚手架/模板,通过这个脚手架/模板我们可以快速的创建出一个项目. 比如下图中的这些就是mav ...

  6. Androidmanifest.xml文件格式详解(转载)

    https://www.jianshu.com/p/eaaae96473f6 来自简书大佬的

  7. bugKu变量1

    重点:两个$$,这暗示着第二个$变量的值,作为第一个$的名称. 而且代码审计之后,发现只含有字母. 又暗示在变量中,那么猜想是在全局变量中,而php中全局变量是$GLOBALS.

  8. android实现计时器(转)

    新建布局文件activity_main.xml   <?xml version="1.0" encoding="utf-8"?> <Linea ...

  9. python twain

    self.SD.SetCapability(twain.CAP_DUPLEXENABLED, twain.TWTY_BOOL, 0) #单面扫描 self.SD.SetCapability(twain ...

  10. 【012】JavaSE面试题(十二):多线程(2)

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [012] - JavaSE面试题(十二):多线程(2) 第1问:多线程的创建方式? 方式一:继承 ...