Spring AOP

什么是 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的作用:在程序运行期间,不修改源码对已有方法进行增强。

  1. 用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect)
  2. 经典应用:事务管理、性能监视、安全检查、缓存 、日志等。
  3. Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。

责任链模式
当一个对象在一条链上被多个拦截器处理就被称为责任链模式。

  • 当对代理对象进行调用时,就会触发外层拦截器。
  • 外层拦截器根据代理配置信息,创建内层拦截器链。创建的过程中,会根据表达式判断当前拦截是否匹配这个拦截器。
  • 当整个链条执行到最后时,就会触发创建代理时那个尾部的默认拦截器,从而调用目标方法,最后返回。

动态代理

  • jdk的动态代理,代理接口
    相关类:JdkDynamicAopProxy
  • Cglib代理,扩展代理
    相关类:ObjenesisCglibAopProxy

当目标类实现接口时,使用动态代理,没有则Cglib代理。运行期,初始化时织入。初始化的时候,已经将目标对象进行代理,放入到spring 容器中。

Spring AOP 使用限制

  • 无法在使用 final 修饰的 bean上应用横切关注点。
  • 在 static 和 final 方法上应用横切关注点也是无法做到的。
    – 因为代理需要对Java类进行继承,一旦使用了关键字 final,这将是无法做到的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值