Spring框架浅析 -- AOP

什么是AOP

AOP-Aspect Oriented Programming,通常翻译为面向切面编程。它的提出实际上是为了补充OOP-Object Oriented Programming的一些不足。

那么OOP有哪些不足呢?这里我谈谈自己的一些想法,我们知道OOP的思路通常是,将一个大型的功能划分成若干子功能,然后进一步抽象成为若干小模块或者叫小组件,每一个小组件封装了数据(属性)与操作(方法),我们叫这样的小组件为类,每一个类代表着抽象后的一种对外的服务能力。如下图所示:

通常情况下,OOP是能够将一个庞大而复杂的功能层层切分到一些抽象后的通用化的服务单元上,也就是类上。通过对不同的类进行拼装、组合,实现不同的业务需求,达到可复用的效果。但是在某些应用场景上,仅有OOP是不够的。比如对于一些非常通用的无业务逻辑的功能(打日志、监控、权限验证、数据库连接&关闭&事务处理等),沿着OOP的思路走下去就不是很方便了。当然你也可以针对这些通用功能分别创建工具类,然后在需要使用这种通用功能的时候,使用工具类完成功能。但是试想假设有成千上万的业务相关类都要进行比如打日志这种通用操作,在实际使用的时候,难道你要在每一个业务相关类需要打日志的地方调用工具类完成此功能吗?答案当然是No。而AOP,正是针对这种场景应运而生的。

关于AOP的原理,不可避免地要涉及一系列晦涩难懂的概念,比如什么是连接点-JointPoint,什么是切点-PointCut,什么是切面-Aspect等,想了解这些概念的可以自行google。

我们不去纠结这些概念,只谈谈我对此的一些理解。其实我认为AOP最为重要的就两件事:切入增强逻辑的地方和增强逻辑本身。

顾名思义,切入增强逻辑的地方即在哪里引入通用操作,如Before,After,Around,AfterReturning,AfterThrowing。

增强逻辑本身就要看具体要实现的通用功能了,比如打日志、监控、权限验证、数据库连接&关闭&事务处理等。

详情见下图:

值得注意的是,AOP并不是用来取代OOP的,而是和OOP一起针对不同的使用场景,应对不同需求的。如果是OOP看世界的方式是横向切分的,那么AOP则是换了个角度看世界,更倾向于纵向的层级性切分,估计将AOP翻译为"面向切面编程"也受到了这种思路的影响。因此,AOP适用场合通常为面向纵向切分出的一些通用功能。

Spring支持AOP的原理

在此,我们采用一个权限校验的场景为例,结合Spring源码,来介绍一下Spring是如何支持AOP的。

需求

为了简单描述,我们仅考虑这样一个权限校验的场景,即进入方法时,进行权限校验

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值