基础篇—AOP
1、浅解AOP
AOP思想多用于性能检测、访问控制、事务管理、日志记录等应用场合,我觉得它在这些场合中所起到的功能主要是一次封装,多次应用,如:在日志记录功能中,需求是记录每个业务开始的时间和结束的时间,那么在业务方法内业务代码前记录一次时间,业务代码后记录一次时间就可以实现,如果有十个业务,则需要重复十次,AOP思想就是将这些重复的功能提取出来,然后在调用业务方法的时候再织入,AOP也叫做面向切面编程,假设将上面的业务方法看成树的一段,上面有树心和树心周围的树纹,将树心看成业务代码,那么树心周围的树纹就是我们所需要提取封装的日志记录的代码。
2、AOP术语
<1> 连接点(Joinpoint)
一个类或一段程序代码拥有一些具有边界性质的特定点,这些特定点就被称为连接点(Joinpoint),如:类初始化前、类初始化后、类中方法调用前/调用后、方法抛出异常后等等。而Spring仅支持方法的连接点。
连接点包括两部分信息组成:一是执行点,也就是对哪个方法进行增强;二是执行点的位置信息接收器,包括在方法前增强、方法后增强、环绕增强等。
<2> 切点(Pointcut)
切点作为寻找执行点的条件,在Spring中通过Pointcut接口,使用类和方法进行执行点的定位。
<3> 增强(Advice)
与连接点相辅相成,也包括两部分,一是向执行点织入的增强代码,二是传递执行点的位置信息。Spring所提供的增强接口带有方位名,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。
<4> 目标对象(Target)
增强织入的目标类。在目标类中寻找连接点,通过切点定位连接点,向连接点中传递增强代码和方位信息。
<5> 引介(Introduction)
引介是一种特殊的增强,可以为目标类添加一些属性和方法。
<6> 织入(Weaving)
织入依附于增强,增强需要向目标类进行代码的织入。AOP的三种织入时期:一是编译期织入,需要特殊的Java编译器;二是类装载期织入,需要特殊的类装载器;三是运行时通过动态代理织入;Spring使用第三种织入方式,而AspectJ使用编译期织入和类装载期织入。
<7> 代理(Proxy)
目标类被AOP增强织入代码后会产生一个结果类,这个结果类就是代理类,它具有原目标类的业务方法和增强逻辑。
<8> 切面(Aspect)
由切点和增强组成。
3、SpringAOP
<1> springAOP的代理机制有两种:一种是JDK动态代理;另一种是CGLIB的动态代理。其中JDK只提供接口的动态代理,而不支持类的动态代理。
<2> JDK动态代理主要涉及两个类:Proxy和invocationHandler接口,实现invocationHandler接口,在invoked()方法中通过反射调用目标类方法并和增强代码编织在一起返回一个完整的处理对象,Proxy静态方法newProxyInstance()根据上文返回的处理对象创建一个代理对象,这个对象拥有完整的原目标类方法和增强逻辑。
<3> CGLIB动态代理主要用到拦截方法的技术,主要涉及的类:Enhancer和MethodInceptor接口,实现MethodInceptor接口,在invokeSuper()方法中通过反射调用目标类方法并和增强代码编织在一起返回一个完整的处理对象,Enhance回调上文的处理对象创建一个代理子类。