直入主题,下面对AOP中几个关键的术语进行简单的说明
1)连接点(JoinPoint)
连接点是对程序执行过程中可被织入额外代码的特定点的描述。连接点包含了两个信息,一个是描述代码中定义好的客观存在事物的“位置”,例如某个类中的某个属性、方法等。另一个是描述“位置”在执行过程中的某个时刻,例如:属性的初始化前、属性的初始化后、方法执行前、方法执行后等。
如果我们用代码来描述,则可以像下面这样
//方位描述对象
class Location{
//某对象【作用的对象】
String className ;
//执行点类型【属性、方法等】
String type ;
//某执行点名称【对应的属性名、方法名等】
String name ;
//构造方法
public Location(String className,String type,String name){}
}
//执行点描述对象
class JoinPointDefined{
//方位
Location location ;
//执行时间点
String execTimePoint ;
//构造方法
public JoinPointDefined(Location location,String timePoint){}
}
class A{
String getName(){}
int getAge(){}
}
//执行点1
JoinPointDefined joinpoint1 = new JoinPointDefined(new Location("com.A",“method”,"getName"),"before") ;
//执行点2
JoinPointDefined joinpoint1 = new JoinPointDefined(new Location("com.A",“method”,"getName"),"after") ;
//执行点3
JoinPointDefined joinpoint2 = new JoinPointDefined(new Location("com.A",“method”,"getAge),"after") ;
//执行点N.....
对于不同的AOP实现框架,其能支持的连接点类型和运行时时刻也不尽相同,例如Spring AOP框架支持对方法在执行前、执行后、执行前后、抛出异常后等几个时刻织入代码。
以上面的类A为例,其中有两个方法,假设Spring AOP框架只支持方法的执行前、执行后、抛出异常后的3个时刻,那么对Spring AOP而已其类A的执行点有 2*3 = 6 个 。
在实际的代码中,我们一般都需要明确的指定在哪些方法上织入我们额外的代码,那么如何来描述呢, 于是便有了切点(Pointcut)
2)切点(Pintcut)
切点用于明确指定连接点中的“方位”,如具体的哪些类中的哪些方法。切点就像SQL中的where条件,其目的就是使用类和方法作为筛选条件在众多的连接点中筛选出满足条件的。在Spring AOP中,切点通过org.springframework.aop.Pointcut接口描述。
通过切点我们筛选出了满足条件的类型和方法,但该方法对应了多个连接点,为了进一步的删选,我们还可以在筛选条件中加上“执行时刻”的信息。
在Spring AOP框架中使用Advice(增强)来描述“执行时刻”的信息。
3)增强(Advice)
增强除了描述“执行时刻”(方位)的信息外,同时还包含了我们在连接点上要织入的程序代码。
在Spring AOP中,每个增强接口都各自代表了其方位信息,如:BeforeAdvice、AfterReturningAdvice等。
4)切面(Aspect)
切面由切点(Pointcut)和增强(Advice)组成,它既包括横切逻辑的定义,也包括连接点的定义。Spring AOP框架根据切面的定义来实施AOP的工作。可以理解为切面就是对切点和增强的引用。
5)目标对象(Target)
上面的“连接点”、“切点”和“增强”都是基于“类”在描述的,其定义的是某些类型中的某些方法上的某些预先定义的运行时刻,可以说他们都是静态的描述信息。
但在程序的运行过程中,每个被切面筛选出的类都可能会被实例化成多个实例,而各个实例就是这里的目标对象,Spring AOP框架会在各个实例上运行织入的代码【可能运行期动态加入执行逻辑,也可能编译期直接织入到class文件中】。
6)织入
就是将增强添加到目标类型的具体连接点上的过程。其实现的方法主要有以下三种
(1):编译器织入,要求使用特殊的编译器
(2):类装载期织入,要求使用特殊的类装载器
(3):动态代理织入
Spring使用动态大理织入,AspectJ采用编译期和类装载期织入。
7)引介(Introduction)
它是一种特殊的增强,由于使用的不是很多,所以放在最后说明。通过引介这种特殊的增强,我们可以给类添加一些属性和方法,例如让某个类通过引介也实现某个接口并为该类添加接口的实现代码。
Spring中的引介接口为:IntroductionInterceptor,Spring为该接口提供了实现类 DelegatingIntroductionInterceptor,一般情况下,我们只需要扩展该实现类就可以定义自己的引介增强类了。
在后面还是基于代码逐步的对Spring AOP进行进一步的说明,包括各种实现方式。
原文地址:https://blog.51cto.com/dengshuangfu/2396632