什么是 AOP
AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,是OOP的延续,而这里的切面则代表动态的将代码加入到指定的方法或位置上,一句话总结:在不改变原有代码的条件下,对该有功能进行扩展。
AOP的相关概念
1、 切面(Aspect):
- 切面其实就是共有功能的实现
- 在Spring Aop指的就是“切面类” ,切面类会管理着切点、通知。
- 切点和通知的集合
- 切面是切点和通知的集合,一般单独作为一个类。
- 通知和切点共同定义了关于切面的全部内容,它是在何时和何处完成什么功能。
2、通知(Advice):
- 切面的工作被称为通知
- 通知定义了切面要做什么以及在何时做。
- 5种通知类型
- 前置通知(Before)—实现MethodBeforeAdvice接口:在目标方法被调用之前调用通知功能。
- 后置通知(After)—实现AfterReturningAdvice接口:在目标方法完成之后调用通知,不会关心方法的输出是什么。
- 返回通知(After-Returning):在目标方法成功执行之后调用通知。
- 异常通知(After-throwing):在目标方法成功执行之后调用通知。
- 环绕通知(Around)—实现MethodInterceptor接口:目标方法执行前后都会执行自定义的行为,相当于合并了前后置通知。
3、切点(Pointcut):
- 切点定义了切面在什么地方
- 切点是连接点的集合(就是方法的集合)
4、连接点(Join point):
- 连接点是在应用执行过程中能够插入切面的一个点。
- 这些点可以是调用方法时,抛出异常时。
- Spirng只支持方法级别的连接点。
5、目标对象(Target Object): 指定是增强的对象
(6)引入(Introduction)
引入就是类层面的增强,它允许我们向现有的类添加新方法或属性。
(7)织入(Weaving) : spring aop用的织入方式:动态代理。 就是为目标对象创建动态代理的过程就叫织入。
Spring AOP 原理
AOP思想的实现一般都是基于代理模式。
AOP的作用:在程序运行期间,不修改源码对已有方法进行增强。
- 用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect)。
- 经典应用:事务管理、性能监视、安全检查、缓存 、日志等。
- Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。
责任链模式
当一个对象在一条链上被多个拦截器处理就被称为责任链模式。
- 当对代理对象进行调用时,就会触发外层拦截器。
- 外层拦截器根据代理配置信息,创建内层拦截器链。创建的过程中,会根据表达式判断当前拦截是否匹配这个拦截器。
- 当整个链条执行到最后时,就会触发创建代理时那个尾部的默认拦截器,从而调用目标方法,最后返回。
动态代理
- jdk的动态代理,代理接口
相关类:JdkDynamicAopProxy - Cglib代理,扩展代理
相关类:ObjenesisCglibAopProxy
当目标类实现接口时,使用动态代理,没有则Cglib代理。运行期,初始化时织入。初始化的时候,已经将目标对象进行代理,放入到spring 容器中。
Spring AOP 使用限制
- 无法在使用 final 修饰的 bean上应用横切关注点。
- 在 static 和 final 方法上应用横切关注点也是无法做到的。
– 因为代理需要对Java类进行继承,一旦使用了关键字 final,这将是无法做到的。