JoinPoint:从单词意思理解为:连接点,是的,它是程序在执行过程中可以被外部程序可以织入的点,它可以是方法执行前,方法执行后等,理论上讲,程序执行过程中的任何一个点都应该可以成为一个织入点。
Pointcut:程序运行过程中既然有这么多织入点,那么如何定位我们比较感兴趣的一下点呢?PointCut实际上是对织入点的表述,通过PointCut可以指定一组我们感兴趣的织入点,它定义了相应的操作处理Advice将要发生的地方。另外,PointCut可以通过通配、正则表达式等方式将JoinPoint集中起来,也可以进行逻辑组合运算,将两个或者多个PointCut通过一定的逻辑运算,可以组合成一些更为复杂的PointCut。
Advice是单一的逻辑关注点的载体,Advice 定义了在切入点pointcut 里面定义的连接点具体要做的操作和处理,它通过 before、after 和 around 来区别是在每个切入点之前、之后还是代替执行的代码。
Target :符合JoinCut指定的条件,在织入过程中,被织入横切逻辑的对象,称为目标对象。
Aspect:切面,由一组PointCut和Advice,定义了一段程序中应该包括的逻辑,以及何时应该执行该逻辑。
Pointcut:程序运行过程中既然有这么多织入点,那么如何定位我们比较感兴趣的一下点呢?PointCut实际上是对织入点的表述,通过PointCut可以指定一组我们感兴趣的织入点,它定义了相应的操作处理Advice将要发生的地方。另外,PointCut可以通过通配、正则表达式等方式将JoinPoint集中起来,也可以进行逻辑组合运算,将两个或者多个PointCut通过一定的逻辑运算,可以组合成一些更为复杂的PointCut。
Advice是单一的逻辑关注点的载体,Advice 定义了在切入点pointcut 里面定义的连接点具体要做的操作和处理,它通过 before、after 和 around 来区别是在每个切入点之前、之后还是代替执行的代码。
Target :符合JoinCut指定的条件,在织入过程中,被织入横切逻辑的对象,称为目标对象。
Aspect:切面,由一组PointCut和Advice,定义了一段程序中应该包括的逻辑,以及何时应该执行该逻辑。
Spring中的AOP的实现实际上是采用一种代理模式,代理模式的结构如图所示,代理对象和被代理对象同时实现了同一个接口,同时代理对象会将内部的请求转发给被代理的对象,当然,在请求转发之前或者之后,代理对象可以执行一些自己的操作,利用这个时机就可以织入一些我们需要的业务逻辑。
在jdk1.3之后,提供了动态代理机制,通过java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler接口,可以轻松实现对某个接口的代理对象。
当然并不是每个类都会实现某个接口,若没有接口,这种情况下,java动态代理可能就无能为力了,这时候需要另一个工具,就是Cglib,它的具体原理是通过字节码扩张方式,扩展taget类的一个子类,然后在子类里面织入横切逻辑。