【ABP杂烩】面向切面编程(AOP)知识总结
目录
本文在学习【老张的哲学】系列文章AOP相关章节后,自己归纳总结的笔记。
1.存在问题
最近,其它项目小组在开发的过程中遇到了一个问题,在日志记录时,用户明明点击的是更新操作,可翻看记录时却发现是查询操作,起初是一头雾水,后面跟踪该更新操作的代码后才发现,在日志记录时确实是写着查询,说到这里,大家可能已经知道问题的所在了,这是由于在开发的过程中,开发员直接从查询的方法里把日志记录的代码直接copy过来,而后面又忘记修改,相信其它的方法里也同样是存在这样的问题。
在平常的开发过程中,日志往往采取如下图的编程方式,在小项目中这种方法简单快捷,没有太大的问题,但对于比较大的项目,这样重复的代码会造成后期的维护成本比较高的,万一哪天说日志记录要换换格式或采用第三方库,估计就蛋疼了。

问题是发现了,有没有改进的方法呢?答案是肯定的。这个时候AOP该闪亮登场了,第一次学习【老张的哲学】系统文章时,也没怎么注意到AOP这个知识点,当时就懵懵懂懂,可后面发现在很多的开源框架里都有涉及到AOP的概念,所以借此机会自己也学习一下,时机成熟时也可以引入到项目里。
2.AOP的概念
AOP是Aspect Oriented Programing的缩写,中文翻译为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从面使得业务逻辑各部分之间的耦合度低,提高程序的可重用性,同时提高开发的效率。
通俗的讲:面向切面编程是在不影响原有功能的前提下,可为软件横向扩展,即可插拔,拔掉软件正常运行,插上扩展功能起效果。
3.AOP应用范围
既然把AOP说得那么厉害,那它到底可以用到哪些地方呢?
- 日记功能
- 审计功能
- 验证功能
- 安全控制
- 事务处理
- 异常处理
- ......
3.AOP实现方式
在.net core中,AOP的实现可以通过以下三种试:
过滤器(Filter):适用于身份验证、参数验证、处理耗时的Web服务
动态代理(DynamicProxy):适用功能模块间的解耦和重用
中间件(Middleware):适用底层服务的通信
主要框架有:
编译时:PostSharp、LinFu、SheepAspect、Fody、CIL
运行时:Castle Windsor、StructureMap、Unity、Spring.NET
4.应用举例
在本文中主要利用PostSharp实现AOP例子,PostSharp是一个在.net平台上实现的AOP框架,是一个收费的框架。好拉,下面将利用PostSharp解决开篇提到的问题,通过AOP为系统添加日志记录功能。
步骤一:新建项目FirstAOP,并添加PostShap

步骤二:定义LogOperator日志记录类,并继承OnMethodBoundaryAspect
[Serializable]
public class LogOperator : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
//MehodExcutionArgs提供了绑定方法的信息和上下文
Console.WriteLine($"【{args.Method.Name}】方法开始记录日志...");
} public override void OnExit(MethodExecutionArgs args)
{
Console.WriteLine($"【{args.Method.Name}】方法结束记录日志...");
}
}
步骤三:将LogOperator切面以特性的形式添加到Main函数中
class Program
{
[LogOperator]
static void Main(string[] args)
{
Console.WriteLine("Hello AOP!");
}
}
步骤四:运行,可以看到日志已经成功开启

5.结束语
本文首先抛出了在项目开发过程中遇到的问题,接着介绍了AOP的相关概念、应用范围和实现方式,最后通过PostSharp的一个简单的例子实现了面向切面编程,当然无论你选择了哪一种方式,AOP都会提高项目的开发效率及后期的维护成本,从而避免了相同的代码复制-黏贴或bug修改数十、数百次,希望在平常的开发中能帮到大家。
【ABP杂烩】面向切面编程(AOP)知识总结的更多相关文章
- Spring之控制反转——IoC、面向切面编程——AOP
控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...
- 设计模式之面向切面编程AOP
动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...
- Spring学习手札(二)面向切面编程AOP
AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...
- Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)
一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...
- Spring框架学习笔记(2)——面向切面编程AOP
介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...
- 【串线篇】面向切面编程AOP
面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- [译]如何在ASP.NET Core中实现面向切面编程(AOP)
原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...
- Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)
在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...
随机推荐
- Ping IP速度范围
<10 极快...局域网10-50 快. 快速服务器50-100 中.普通服务器.100-300 慢.国外服务器.300-1000 极慢.1000+ 很有可能断.
- JS生成URL二维码
需求:项目中需要在UI界面有一个二维码,扫码后可以跳转到二维码包含的URL. 解决方案:在前端用js生成一个包含URL等信息的二维码. 实现: 方案一. <!DOCTYPE HTML PUBLI ...
- 一个小工具,利用php把指定目录文件递归上传到阿里云OSS
cp2oss(_GALLERY_DIR); function cp2oss($directory) { $mydir = dir($directory); while($file = $mydir-& ...
- react native 学习笔记
假设你的机器现在还没安装任何环境. 不同的操作系统.不同的目标平台,具体的步骤也会有所不同.如果你想同时开发android和ios也没问题,只需要先选一个平台开始,另一个平台的环境搭建只是稍有不同 本 ...
- Layui使用table展示数据
今天在Layui官网拿了一个table表格数据展示的源码,研究遇到了很多问题,最后才把数据展示出来,和大家分享下. 源码地址:https://www.layui.com/demo/table/oper ...
- JS中的同步和异步
javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流水线而已,要 ...
- SAS 创建新变量
SAS 创建新变量 在对SAS数据集进行处理时,经常需要根据原有变量或变量值生成新变量.根据要实现功能的不同,SAS提供了多种方法,例如通过数据集选项RENAME=(RENAME语句).赋值语句.求 ...
- 山东省ACM多校联盟省赛个人训练第六场 poj 3335 D Rotating Scoreboard
山东省ACM多校联盟省赛个人训练第六场 D Rotating Scoreboard https://vjudge.net/problem/POJ-3335 时间限制:C/C++ 1秒,其他语言2秒 空 ...
- js获取当前页面的url网址信息小汇总
在WEB开发中,时常会用到javascript来获取当前页面的url网址信息,在这里是我的一些获取url信息的小总结. 下面我们举例一个URL,然后获得它的各个组成部分:http://i.cnblog ...
- ModelAndView返回json对象的方法
这是在spring4之后. @RequestMapping(value = "/returnjson") public ModelAndView getfsd(){ ModelAn ...