AOP的概念
动态代理:
特点:字节码随用随创建,随用随加载
作用:不修改源码的基础上对方法增强
分类:
基于接口的动态代理
基于子类的动态代理
基于接口的动态代理:
涉及的类:Proxy
提供者:JDK官方
如何创建代理对象:
使用Proxy类中的newProxyInstance方法
创建代理对象的要求:
被代理类最少实现一个接口,如果没有则不能使用
newProxyInstance方法的参数:
ClassLoader:类加载器
它是用于加载代理对象字节码的,和被代理对象使用相同的类加载器。
Class[]:字节码数组
它是用于让代理对象和被代理对象有相同方法
InvocationHandler:用于提供增强的代码
它是让我们写如何代理。我们一般都是写一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。
基于子类的动态代理:
涉及的类:Enhancer
提供者:第三方cglib库
如何创建代理对象:
使用Enhancer类中的create方法
创建代理对象的要求:
被代理类不能是最终类
create方法的参数:
Class:字节码
它是用于指定被代理对象的字节码
Callback:用于提供增强的代码
它是让我们写如何代理。我们一般都是写一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。
我们一般写的都是该接口的子接口实现类:MethodInterceptor
什么是AOP
AOP:全称是Aspect Oriented Programming 即:面向切面编程
AOP的作用和优势
作用:在程序运行期间,不修改源码对已有方法进行增强
优势:减少重复代码、提高开发效率、维护方便
AOP的实现方式
spring中的AOP相关术语
- Joinpoint(连接点):
- 所谓连接点是指那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。
- Pointcut(切入点):
- 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。
- Advice(通知/增强):
- 所谓通知是指拦截到Joinpoint之后所要做的事情就是通知
- 通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知
- Introduction(引介):
- 引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field。
- Target(目标对象):
- 代理的目标对象
- Weaving(织入):
- 是指把增强应用到目标对象来创建的代理对象的过程。
- spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。
- Proxy(代理):
- 一个类被AOP织入增强后,就产生一个结果代理类
- Aspect(切面):