我说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 中使用 QT Charts 显示温度传感器
前一篇笔记中实现了QT的Label控件显示CPU的温度,只能显示当前的温度,并不能反映CPU温度的变化情况,现在来实现使用QT Charts的曲线图实现一个实时曲线来显示CPU的温度. 添加对Qt C ...
- hadoop学习(一)环境的搭建
1.安装几台Linux虚拟机.安装的过程就不赘述了,网上教程很多.win7系统上装了一个VMWare,因为一些原因,VMWare版本不是最新的,是VMWare7.1版本,由于VMWare版本不高,所以 ...
- shiro框架整合ssm框架
下面我通过一个web的maven项目来讲解如何将shiro整合ssm框架,具体结构如下图 一.引入依赖的jar包 <?xml version="1.0" encoding=& ...
- nginx 基本配置
server { listen 80; server_name 域名; #access_log /var/log/nginx/admin.log; index index.html index.htm ...
- XSS一些总结
XSS一些总结 除了script以外大多标签自动加载触发JS代码大多用的都是on事件,以下标签都可以用下面的方法去打Cookie以及url等 常见标签 <img><input> ...
- Django基础005-Django开发的整体过程
1.写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:id ...
- 前端-Vue基础1
Vue核心思想:只要改变数据,页面就会发生改变 1.引入vue 1.下载vue.js 2.在script标签的src属性中,引入vue.js <script src="js/vue.j ...
- 创建自己的RSA密钥来保护web.config 加密数据库连接字符串
通过创建自己的RSA密钥来保护web.config1创建RSA密钥:C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis - ...
- Odoo ORM研究1 - BaseModel中的类属性的作用
概述 我们在写odoo项目的时候,经常继承model.Model来创建我们自己的ORM映射关系表. AbstractModel = BaseModel # 源码 class Model(Abstrac ...
- Java程序设计当堂测试 9.20
/*Java当堂测试 ATM机模拟系统由于学习的知识有限,不能完成所有课上项目,文件的应用没有完成,汇款转账功能也没有写,一些要求该退出的地方也没有写,基本功能还算完善*/ 1 package acc ...