spring框架之AOP面向切面编程( 二 )


就可以理解成对象中的方法 , 因为在Spring中 , 只支持方法类型的连接点 。
⑤切入点PointCut
所谓切入点就是连接点的一部分 , 即需要被拦截的连接点就是切入点 。
就可以理解成对象中需要增强的方法 。
⑥通知Advice
也就是增强的方法 , 例子中就是记录日志 。
通知分为前置通知、后置通知、异常通知、最终通知、环绕通知 , 这些后续会讲述 。
⑦切面Aspect
是通知和切入点的结合 , 通知和切入点共同定义了关于切面的全部内容 。它的功能、在何时和何地完成其功能?说白了也就是:
如何将增强方法添加到对应的方法中?
此外还有一个术语叫:引介Introduction
在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或属性 , 这个实际开发中基本涉及不到 。
AOP是基于动态代理的 , 基于两种动态代理机制:JDK动态代理和CGLIB动态代理 。
三、JDK动态代理实现AOP当然JDK动态代理很少使用 , 但是还是都写下 , 就当是对动态代理知识点的一个回顾 。
创建工厂类 , 该类可以获取代理类对象:

spring框架之AOP面向切面编程

文章插图
 
①获取代理对象方法
通过代理工厂的该方法就可以获取一个代理对象 , 为了通用性将返回值设定为Object 。
②实例化代理类对象
Proxy类的静态方法newProxyInstance() , 根据方法名也能知道它是干嘛的 , 基本上动态代理的核心就是这个方法 , 参数有三个:
  • 目标对象的类加载器 。
  • 目标对象实现的接口有哪些 。
  • 调用处理器 。
当然 , 其代码编写有更优的方式 , 在Cglib动态代理中会说明 , 此处就使用最原始的方式 。
③调用处理器
InvocationHandler是一个接口 , 使用匿名内部类的方式获取其对象 , 其有一个方法叫invoke , 该方法也有三个参数 。
如果方法名是我们需要增强的方法 , 那么我们给它增加一个功能 , 也就是④ 。
如果不是 , 那么调用自己就好了 , 也就是method.invoke(target,args) 。
代码写完 , 做个测试
spring框架之AOP面向切面编程

文章插图
 
⑤功能测试
因为在动态代理中我们只选择对queryAll方法增强 , 所以用代理对象调用queryAll方法时会额外输出“记录日志” 。
而update方法不增强 , 就只会执行本身的功能 , 也就是“更新数据” 。
当然Jdk动态代理有一个局限 , 就是必须要有接口才行 , 所以就引出了CGLIB的使用 。
四、CGLIB动态代理CGLIB(Code Generation Library)是一个强大的 , 高性能的开源项目 。
其作用最直接的解释就是:不需要接口也可以实现动态代理 。
spring框架之AOP面向切面编程

文章插图
 
①获取代理对象生成器
Enhancer , 增强器的意思 , 也就是通过它来实现方法的增强 。
②设置目标对象的Class对象
该参数是目标对象的Class对象 , 不是类加载器 , 和Jdk动态代理有一定的区别 。
③设置回调函数
Jdk动态代理中的三个参数:类加载器、接口以及调用处理器 , Cglib中不需要接口 , 该参数就相当于jdk动态代理中的调用处理器 。
setCallback方法的参数需要该接口的实现类对象 , 我们可以直接使用匿名内部类的方式作为参数 , 就和调用处理器一样 。
但是在本类中实现这个接口 , 不就有了一个现成的实现类么?而this表示谁调用我就是谁 , 本类或者本类的子类都行 。
这里进一步优化代码的编写 , 上述Jdk动态代理中也可以这样优化 。
④intercept方法
这是MethodInterceptor接口中的一个方法 , intercept , 翻译就是拦截的意思 。
其参数和Jdk中的调用处理器基本一样 。
⑤生成代理对象
enhancer调用create()生成代理对象 。
代码写完 , 做个测试
spring框架之AOP面向切面编程

文章插图


推荐阅读