【ABP杂烩】面向切面编程(AOP)知识总结

简介: 原文:【ABP杂烩】面向切面编程(AOP)知识总结目录 1.存在问题 2.AOP的概念 3.AOP应用范围 3.AOP实现方式 4.应用举例 5.结束语 本文在学习【老张的哲学】系列文章AOP相关章节后,自己归纳总结的笔记。
原文: 【ABP杂烩】面向切面编程(AOP)知识总结

目录

1.存在问题

2.AOP的概念

3.AOP应用范围

3.AOP实现方式

4.应用举例

5.结束语


本文在学习【老张的哲学】系列文章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修改数十、数百次,希望在平常的开发中能帮到大家。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
设计模式 SQL 运维
面向切面:AOP(1)
面向切面:AOP(1)
46 2
面向切面:AOP(1)
|
2月前
|
Java 数据库连接 应用服务中间件
Spring5源码(39)-Aop事物管理简介及编程式事物实现
Spring5源码(39)-Aop事物管理简介及编程式事物实现
24 0
|
3月前
|
XML 设计模式 SQL
Spring6 面向切面(AOP)
Spring6 面向切面(AOP)
|
5月前
|
Java Spring
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
spring框架之AOP模块(面向切面),附带通知类型---超详细介绍
51 0
|
6月前
|
前端开发 Java 数据库连接
Spring Aop:面向切面编程
Spring Aop:面向切面编程
35 0
|
3月前
|
XML Java 数据格式
spring之面向切面:AOP(2)
【1月更文挑战第15天】 一、基于注解的AOP 1、技术说明 2、准备工作 3、创建切面类并配置 4、各种通知 5、切入点表达式语法 6、重用切入点表达式 7、获取通知的相关信息 8、环绕通知 9、切面的优先级 二、基于XML的AOP 1、准备工作 2、实现
66 2
|
3月前
|
设计模式 SQL 缓存
spring之面向切面:AOP(1)
【1月更文挑战第15天】 一、场景模拟 1、声明接口 2、创建实现类 3、创建带日志功能的实现类 4、提出问题 二、代理模式 1、概念 2、静态代理 3、动态代理 4、测试 三、AOP概念及相关术语 1、概述 2、相关术语 ①横切关注点 ②通知(增强) ③切面 ④目标 ⑤代理 ⑥连接点 ⑦切入点 3、作用
90 2
|
4月前
|
存储 Java 数据库
spring核心技术(下)--面向切面aop的特点加案例论证
spring核心技术(下)--面向切面aop的特点加案例论证
|
6月前
|
XML 监控 Java
Spring系列篇--关于AOP【面向切面】的详解
Spring系列篇--关于AOP【面向切面】的详解
28 0
|
6月前
|
XML Cloud Native Java
Spring AOP使用指南: 强大的面向切面编程技术
Spring AOP使用指南: 强大的面向切面编程技术
43 0