aop 获取方法入参_Spring AOP学习笔记:AOP概述

f1b0b5a42b32d07d572d3138e7860afa.png

1. AOP概述

  软件开发一直在寻求更加高效、更易维护甚至更易扩展的方式。为了提高开发效率,我们对开发使用的语言进行抽象,走过了从汇编时代到现在各种高级语言繁盛之时期;为了便于维护和扩展,我们对某些相同的功能进行归类并使之模块化,冲出了最初的"原始部落",走过了从过程化编程到面向对象编程(OOP)的"短暂而漫长"的历程。但不管走过的路有多长,多么坎坷,我们一直没有停止寻找更加完美、更加高效的软件开发方法,过去如此,现在亦然。

当OOP被提出来,以取代过去基于过程化编程的开发方法时,或许那个时代的人都会以为,面向对象编程和面向对象的软件开发就是我们一直追求的那颗能够搞定一切的"银弹"。但不得不承认的是,即使面向对象的软件开发模式,依然不能很好地解决软件开发中的所有问题。

软件开发的目的,最终是为了解决各种需求,包括业务需求和系统需求。使用面向对象方法,我们可以对业务需求等普通关注点进行很好的抽象和封装,并且使之模块化。但对于系统需求(比如日志记录、权限验证、事务管理等)一类的关注点来说,情况却有所不同。

对于业务需求而言,需求与其具体实现之间的关系基本上是一对一的。我们可以在系统中某一个确定的点找到针对这种需求的实现,无论从开发还是维护的角度,都比较方便。比如电商系统中的账户管理模块、订单模块、支付模块等,可以很容易地按照功能划分模块并完成开发。

但是,事情并没有结束!开发中为了调试或在进入生产环境后为了对系统进行监控,我们需要为这些业务需求的实现对象添加日志记录功能;或者,业务方法的执行需要一定的权限限制,那么方法执行前肯定需要有相应的安全检查功能。而这些则属于系统需求的范畴。虽然需求都很明确(加入日志记录、加入安全检查),但是要将这些需求以面向对象的方式实现并集成到整个的系统中去,可就不是一个需求对应一个实现那么简单了,系统中的每个业务对象都需要加入日志记录,加入相应的安全检查,那么,这些需求的实现代码就会遍及所有业务对象。

对于系统中普通的业务关注点,OOP可以很好地对其进行分解并使之模块化,但却无法更好地避免类似于系统需求的实现在系统中各处散落这样的问题。所以,我们要寻求一种更好的方法,它可以在OOP的基础上更上一层楼,提出一套全新的方法论来避免以上问题,也可以提供某种方法对基于OOP的开发模式做一个补足,帮助OOP以更好的方式解决以上问题。迄今为止,我们还找不到比OOP更加有效的软件开发模式。不过,我们找到了后者,那就是AOP,对OOP的补足。

AOP全称为Aspect-Oriented Programming,中文通常翻译为面向方面编程。使用AOP,我们可以对类似于Logging和Security等系统需求进行模块化的组织,简化系统需求与实现之间的对比关系,进而使得整个系统的实现更具模块化。

对于一个软件系统而言,日志记录、安全检查、事务管理等系统需求就像一把把刀“恶狠狠”地横切到我们组织良好的各个业务功能模块之上。以AOP的行话来说,这些系统需求是系统中的横切关注点(cross-cutting concern)。使用传统方法,我们无法更好地以模块化的方式,对这些横切关注点进行组织和实现。所以AOP引入了Aspect的概念,用来以模块化的形式对系统中的横切关注点进行封装。Aspect 之对于AOP,就相当于Class之对于OOP。我们说过AOP仅是对OOP方法的一种补足,当我们把以Class形式模块化的业务需求和以Aspect形式模块化的系统需求拼装到一起的时候,整个系统就算完成了。

2. AOP相关概念

在进一步学习Spring AOP之前,我们还需要了解一下AOP涉及的相关概念:

2.1 切点(JoinPoint)

在系统运行之前,AOP的功能模块都需要织入到OOP的功能模块中。所以,要进行这种织入过程,我们需要知道在系统的哪些执行点上进行织入操作,这些将要在其之上进行织入操作的系统执行点就称之为切点(Joinpoint)。对应到spring中可以理解为具体拦截的某个业务点。

以下是一些较为常见的Joinpoint类型

  • 方法调用(Method Call)。当某个方法被调用的时候所处的程序执行点。
  • 方法调用执行(Method Call execution)。也可以称之为方法执行,该Joinpoint类型代表的是某个方法内部执行开始时点,这需要与上面的方法调用类型的Jointpoint进行区分。方法调用(method call)是在调用对象上的执行点,而方法执行(method execution)则是在被调用到的方法逻辑执行的时点,对于同一对象,方法调用要先于方法执行。
  • 构造方法调用(Constructor Call)。程序执行过程中对某个对象调用其构造方法进行初始化的时点。
  • 构造方法执行(Constructor Call Execution)。构造方法执行和构造方法调用之间的关系类似于方法执行和方法调用之间的关系,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值