【框架】123:spring框架之面向切面编程( 二 )


文章图片
目标对象Target
也就是需要被增强的对象 。
织入Weaving
根据目标对象来创建代理对象的整个过程 。
代理对象Proxy
即根据目标对象生成的代理对象 。
连接点JoinPoint
所谓连接点是指那些被拦截到的点 。
就可以理解成对象中的方法 , 因为在Spring中 , 只支持方法类型的连接点 。
切入点PointCut
所谓切入点就是连接点的一部分 , 即需要被拦截的连接点就是切入点 。
就可以理解成对象中需要增强的方法 。
通知Advice
也就是增强的方法 , 例子中就是记录日志 。
通知分为前置通知、后置通知、异常通知、最终通知、环绕通知 , 这些后续会讲述 。
切面Aspect
是通知和切入点的结合 , 通知和切入点共同定义了关于切面的全部内容 。 它的功能、在何时和何地完成其功能?说白了也就是:
如何将增强方法添加到对应的方法中?
此外还有一个术语叫:引介Introduction
在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或属性 , 这个实际开发中基本涉及不到 。
AOP是基于动态代理的 , 基于两种动态代理机制:JDK动态代理和CGLIB动态代理 。
三、JDK动态代理实现AOP
当然JDK动态代理很少使用 , 但是还是都写下 , 就当是对动态代理知识点的一个回顾 。
创建工厂类 , 该类可以获取代理类对象:
【框架】123:spring框架之面向切面编程
文章图片
获取代理对象方法
通过代理工厂的该方法就可以获取一个代理对象 , 为了通用性将返回值设定为Object 。
实例化代理类对象
Proxy类的静态方法newProxyInstance() , 根据方法名也能知道它是干嘛的 , 基本上动态代理的核心就是这个方法 , 参数有三个:
目标对象的类加载器 。
目标对象实现的接口有哪些 。
调用处理器 。
当然 , 其代码编写有更优的方式 , 在Cglib动态代理中会说明 , 此处就使用最原始的方式 。
调用处理器
InvocationHandler是一个接口 , 使用匿名内部类的方式获取其对象 , 其有一个方法叫invoke , 该方法也有三个参数 。
如果方法名是我们需要增强的方法 , 那么我们给它增加一个功能 , 也就是 。
如果不是 , 那么调用自己就好了 , 也就是method.invoke(target,args) 。
代码写完 , 做个测试
【框架】123:spring框架之面向切面编程
文章图片
功能测试
因为在动态代理中我们只选择对queryAll方法增强 , 所以用代理对象调用queryAll方法时会额外输出“记录日志” 。
而update方法不增强 , 就只会执行本身的功能 , 也就是“更新数据” 。
【框架】123:spring框架之面向切面编程】当然Jdk动态代理有一个局限 , 就是必须要有接口才行 , 所以就引出了CGLIB的使用 。
四、CGLIB动态代理
CGLIB(CodeGenerationLibrary)是一个强大的 , 高性能的开源项目 。
其作用最直接的解释就是:不需要接口也可以实现动态代理 。
【框架】123:spring框架之面向切面编程
文章图片
获取代理对象生成器
Enhancer , 增强器的意思 , 也就是通过它来实现方法的增强 。
设置目标对象的Class对象
该参数是目标对象的Class对象 , 不是类加载器 , 和Jdk动态代理有一定的区别 。
设置回调函数
Jdk动态代理中的三个参数:类加载器、接口以及调用处理器 , Cglib中不需要接口 , 该参数就相当于jdk动态代理中的调用处理器 。