这只是一篇入门理解!

一直听说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. 让你发布的nuget包支持源代码调试

    前情概要 在不久的从前(也还是要以年为单位哈), 我们如果需要调试第三方代码, 或者框架代码很麻烦. 需要配置symbols, 匹配原始代码路径等. 为此, MS推出了 Source Link 功能, ...

  2. Centos 8 上定时备份Gitlab ,脚本实现定时备份,备份恢复

    定时备份 要求 为了能够备份和恢复,请确保你的系统上安装了Rsync yum install rsync -y 配置备份目标机器免密认证 执行ssh-keygen -t rsa 生成私钥和公钥 ssh ...

  3. 19 shell代码块重定向

    代码块是由多条语句组成的一个整体,for.while.until循环或者if-else.case-in选择结构,或者由{ }包围起来的命令都可以称为代码块. 将重定向命令放在代码块的结尾处,就可以对代 ...

  4. buu [MRCTF2020]EasyCpp

    上次没写出,这次认真分析了一下,发现自己的调试水平也有了上涨,也看了一些C++逆向的文章,尤其是stl,发现C++的oop还是挺复杂,这题还没考啥虚函数的还行了. 一.拖入ida,找到主函数,还是挺容 ...

  5. buu 红帽杯easyre

    一.拖入ida静态分析 找到关键函数,然后 这步是可以得出前4个字符是flag,不知道为啥我这边的v15的内存地址为空,不然可以异或解出来的,ida日常抽风... 十次的base64加密,我用在线平台 ...

  6. oracle 大表在线删除列操作(alter table table_name set unused )

    在某些情况下业务建的表某些列没有用到,需要进行删除,但是如果是数据量很大的大表,直接 alter table table_name drop column column_name;这种方法删除,那么将 ...

  7. wireshark 调试 https/http2和grpc流量

    本文浏览器以 Chrom 为例 平常需要抓包的场景比较少,记录一下防止下次忘记配置 1. 解析 TLS 在本地创建用于保存 ssl logfile 的文件(文件可以存放到任意位置), 并添加到环境变量 ...

  8. 深入理解Java容器——HashMap

    目录 存储结构 初始化 put resize 树化 get 为什么equals和hashCode要同时重写? 为何HashMap的数组长度一定是2的次幂? 线程安全 参考 存储结构 JDK1.8前是数 ...

  9. ARTS第十一周

    受辞职考研和新冠肺炎疫情影响,一直没更.遗憾,数学和专业课再高点就有戏了.继续. 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3. ...

  10. Django基础006--在pycharm中将项目配置为Django项目

    1.在File--Settings--搜索Django 操作按照如图所示 2.在pycharm右上方项目处,选择Edit Configurations 3.在Name处写上项目名称 python环境选 ...