我说AOP(面向切面编程)--藏在苹果里的五角星
这只是一篇入门理解!
一直听说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(面向切面编程)--藏在苹果里的五角星的更多相关文章
- 谈一谈AOP面向切面编程
AOP是什么 : AOP面向切面编程他是一种编程思想,是指在程序运行期间,将某段代码动态的切入到指定方法的指定位置,将这种编程方式称为面向切面编程 AOP使用场景 : 日志 事务 使用AOP的好处是: ...
- AOP 面向切面编程, Attribute在项目中的应用
一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...
- AOP面向切面编程的四种实现
一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...
- Javascript aop(面向切面编程)之around(环绕)
Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...
- Method Swizzling和AOP(面向切面编程)实践
Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...
- [转] AOP面向切面编程
AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
- C# AOP 面向切面编程之 调用拦截
有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...
- 【原创】Android AOP面向切面编程AspectJ
一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...
随机推荐
- 其实 Linux IO 模型没那么难
文章首发于公众号「陈树义」及个人博客 shuyi.tech,欢迎关注访问. 博主个人独立站点开通啦!欢迎点击访问:https://shuyi.tech IO 其实就是 Input 和 Output,在 ...
- 21、部署heartbeat
21.1.heartbeat部署规划: 本文的实验环境是虚拟机设备: 名称 接口 ip 用途 master-db(主) eth0 10.0.0.16/24 用于服务器之间的心跳连接(直连) eth1 ...
- UI自动化学习笔记- Selenium元素定位及元素操作
一.元素定位 1. 如何进行元素定位? 元素定位就是通过元素的信息或元素层级结构来定位元素的 2.定位工具 浏览器开发者工具 3.元素定位方式 Selenium提供了八种定位元素方式 id name ...
- [心得笔记]spring常用的三种依赖注入方式
一.目前使用最广泛的 @Autowired:自动装配 基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器.接口.方法注入,使用方式如下: @Autowired 构造方法.方法.接口 ...
- Java的反射机制一
Java具有一定的动态性,我们可以利用反射机制,字节码操作来获得类似动态语言的特性. 动态操作对象,构造方法,属性,方法 Demo2 如何取得属性和方法以及构造器 public class Demo2 ...
- 重学 Spring Boot
什么是Spring Boot Spring Boot 是 Spring 开源组织下的一个子项目,也是 Spring 组件一站式解决方案,主要是为了简化使用 Spring 框架的难度和简化 Spring ...
- python05篇 json和函数
一.json json就是一个字符串,只不过是所有语言能解析这个字符串.1.1 把python的数据类型转为json import json d = {'name': 'xiaohei', 'cars ...
- python04篇 文件操作(二)、集合
一.文件操作(二) 1.1 利用with来打开文件 # with open ,python 会自动关闭文件 with open('a.txt', encoding='utf-8') as f: # f ...
- Git错误:unable to access 'https://git.voicegu.com/qa/qa.git/': SSL certificate problem: unable to get local issuer certificate
fatal: unable to access 'https://git.voicegu.com/qa/qa.git/': SSL certificate problem: unable to get ...
- 2021.07.21 NPCBOT增加人类的SS和74
#ssinsert into `creature_template_npcbot_appearance`(`entry`,`name*`,`gender`,`skin`,`face`,`hair`,` ...