Advice?Pointcut?Aspect?JoinPoint?Advisor?

AOP概念?傻傻分不清?编程

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

切面、切入点、链接点、建议(加强)

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

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出现了,看看它的构造:code

clipboard.png

没错!SpringAdvicePointcut两个封装起来了,就叫Advisor。一个Advisor就可以肯定什么时间地作什么,构造它须要:Advice + Pointcut
看看在XMl中一个Advisor的定义:对象

clipboard.png
了解了这些还不够,剩下一个概念Aspect。实际上,Aspect是一个的概念,它表明了一系列的Advisor,也就是说,一个Aspect其实等于:blog

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

看看一个Aspect的定义接口

clipboard.png
完毕!事务

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

clipboard.png
Pointcut对象,在程序执行到要加强的地方时,被封装好传入进来,要不要使用取决于本身(除非是Around),他表明了当时的上下文信息,就是一个在现场者。

整片文章总结下来就是:

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

clipboard.png

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息