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
没错!Spring
将Advice
和Pointcut
两个封装起来了,就叫Advisor
。一个Advisor
就可以肯定什么时间地作什么,构造它须要:Advice + Pointcut
。
看看在XMl中一个Advisor
的定义:对象
了解了这些还不够,剩下一个概念Aspect
。实际上,Aspect
是一个虚
的概念,它表明了一系列的Advisor
,也就是说,一个Aspect
其实等于:blog
他他他要在哪里(Pointcut)何时(@Before)对谁(JoinPoint)作什么(Advice) 她她她要在哪里(Pointcut)何时(@Before)对谁(JoinPoint)作什么(Advice) 它它它要在哪里(Pointcut)何时(@Before)对谁(JoinPoint)作什么(Advice)
看看一个Aspect
的定义接口
完毕!事务
隐隐约约还有什么东西漏下了?没错!就是Pointcut
,前面说过,这个是运行时的对象
,是对Who
的抽象,代码:
Pointcut
对象,在程序执行到要加强的地方时,被封装好传入进来,要不要使用取决于本身(除非是Around
),他表明了当时的上下文信息,就是一个在现场者。
整片文章总结下来就是:
我要定义一个切面(Aspect),可是切面是虚的,只是定义用来表明一到多个Advisor,那我要先定义一个Advisor,Advisor是表示 要作什么+在哪里作,那就定义Advice->作什么,定义Pointcut->在哪里作,也就是说: Aspect => n * Advisor => n * ( Advice + Pointcut) == n * (@Before/@After/@Around + Pointcut) 完毕!