Advice?Pointcut?Aspect?JoinPoint?Advisor?

AOP概念?傻傻分不清?

AOP是一种面向切面的编程思想,最小单位是切面;Java是基于OOP的编程思想,最小单位是类。
虽然思想不同,但是AOP却能够给Java提供强大的加持,Spring AOP的应用就是最好的例子。
AOP思想是如此优秀,所以在一开始,就有人尝试建立组织来统一规范,这个组织就是AOP联盟AOP联盟AOP的实现提出了多种方案,主要有:基于拦截的(Interceptor)、直接修改字节码的。(可忽略)
先来说说Spring中,AOP的几个主要概念:

切面、切入点、连接点、建议(增强)

开始晕了… 深吸一口气,慢慢往下看。
一般我们做事情,时间、地点、人物、做什么缺一不可,那么我们看看这些是如何对应的。
Spring AOP的设计是遵循AOP联盟的。AOP联盟中有两个主要概念:Advice、JoinPoint

Advice:增强,这个比较好理解,就是想要增加的功能,比如:上下包裹一个事务、日志打印等,我们把它对应为 'What'
JoinPoint:行话叫:程序'运行点'。什么意思呢?就是当代码运行到需要执行Advice时的那个地方的信息,注意是运行时状态,且结尾是'的信息'(是一个名词),我们把它对应为'Who'

Spring引入了这两个概念,并对Advice作了增强实现:

@Before、@After、@Around等等:行话分别是前置增强、后置增强、环绕增强,
主要负责控制'Advice'是在方法前还是方法后等哪个范围执行,我们把它对应为 'When+Advice=> When + What'

但是单单这两个还是不够的,Spring另外提供了概念:

Pointcut:行话叫切入点,实际上是`Spring`抽象出来的,用来`查找哪些`需要进行增强的接口,我们把它对应为'Where'

这些概念连起来,意思就是我要在哪里(Pointcut)什么时候(@Before)对谁(JoinPoint)做什么(Advice)
看起来好像理解了,但是有感觉还是有点混乱,好多概念,好乱,还是好乱…
这时候,Spring出手了,他也觉得有点乱,怎么办呢?
Advisor出现了,看看它的构造:

《Advice?Pointcut?Aspect?JoinPoint?Advisor?》

没错!SpringAdvicePointcut两个封装起来了,就叫Advisor。一个Advisor就能够确定什么时间地做什么,构造它需要:Advice + Pointcut
看看在XMl中一个Advisor的定义:

《Advice?Pointcut?Aspect?JoinPoint?Advisor?》
了解了这些还不够,剩下一个概念Aspect。实际上,Aspect是一个的概念,它代表了一系列的Advisor,也就是说,一个Aspect其实等于:

他他他要在哪里(Pointcut)什么时候(@Before)对谁(JoinPoint)做什么(Advice)
她她她要在哪里(Pointcut)什么时候(@Before)对谁(JoinPoint)做什么(Advice)
它它它要在哪里(Pointcut)什么时候(@Before)对谁(JoinPoint)做什么(Advice)

看看一个Aspect的定义

《Advice?Pointcut?Aspect?JoinPoint?Advisor?》
完毕!

隐隐约约还有什么东西漏下了?没错!就是Pointcut,前面说过,这个是运行时的对象,是对Who的抽象,代码:

《Advice?Pointcut?Aspect?JoinPoint?Advisor?》
Pointcut对象,在程序执行到要增强的地方时,被封装好传入进来,要不要使用取决于自己(除非是Around),他代表了当时的上下文信息,就是一个在现场者。

整片文章总结下来就是:

我要定义一个切面(Aspect),但是切面是虚的,只是定义用来代表一到多个Advisor,那我要先定义一个Advisor,Advisor是表示 要做什么+在哪里做,那就定义Advice->做什么,定义Pointcut->在哪里做,也就是说:
Aspect 
    => n * Advisor 
    => n * ( Advice + Pointcut) == n * (@Before/@After/@Around + Pointcut) 
完毕!

《Advice?Pointcut?Aspect?JoinPoint?Advisor?》

    原文作者:阿全啊
    原文地址: https://segmentfault.com/a/1190000018530278
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞