spring -- AOP

一.什么是AOP?

   AOP(Aspect Oriented Programming)是面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,面向切面编程将程序抽象成各个切面。所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。

 

 

 

 

1.AOP的术语

  • 连接点(join point):程序在执行流程中经过的一个个时间点,这个时间点可以是方法调用时,或者是执行方法中异常抛出时,也可以是属性被修改时等时机,在这些时间点上你的切面代码是可以(注意是可以但未必)被注入的
  • 切点(point cut):连接点 只是切面代码**可以被织入(增强)**的地方,但我并不想对所有的 JoinPoint 进行织入,这就需要某些条件来筛选出那些需要被织入的 JoinPoint,Pointcut 就是通过一组规则(使用 AspectJ pointcut expression language 来描述) 来定位到匹配的 Joinpoint
  • 通知(advice):Pointcut 通过其规则指定了哪些 JoinPoint 可以被织入,而 Advice 则指定了这些 Joinpoint 被织入(或者增强)的具体时机与逻辑,是切面代码真正被执行的地方,主要有五个织入时机,
    1. Before Advice: 在 JoinPoints 执行前织入
    2. After Advice: 在 JoinPoints 执行后织入(不管是否抛出异常都会织入)
    3. After returning advice: 在 JoinPoints 执行正常退出后织入(抛出异常则不会被织入)
    4. After throwing advice: 方法执行过程中抛出异常后织入
    5. Around Advice: 这是所有 Advice 中最强大的,它在 JoinPoints 前后都可织入切面代码,也可以选择是否执行原有正常的逻辑,如果不执行原有流程,它甚至可以用自己的返回值代替原有的返回值,甚至抛出异常。 在这些 advice 里我们就可以写入切面代码了 综上所述,切面(Aspect)我们可以认为就是 pointcut 和 advice,pointcut 指定了哪些 joinpoint 可以被织入,而 advice 则指定了在这些 joinpoint 上的代码织入时机与逻辑。
  • 目标对象(target):即被代理的对象
  • 引入(introduction):是指引入新的类和其方法,增强现有bean的功能
  • 织入(wearing):它是一个通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按各类通知织入约定流程的过程
  • 切面(Aspect):是一个可定义切点,各类通知和引入的内容,Spring AOP 将通过它的信息来增强Bean的功能或者将对应的方法织入流程

 

 

 2.Spring AOP的实现方式

  • JDK动态代理:这是java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP 默认采用这种方式,在接口的代理实例织入代码。
  • CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。

二.AOP的应用场景

日志功能,事务处理等

三.Spring AOP 不能对哪些类进行增强 

  1. Spring AOP只能对Ioc容器中的Bean进行增强,对于不收容器管理的的对象不能增强
  2. 由于CGLib采用动态创建子类的方式生成代理对象,所以不能对final修饰的类进行代理

四.为什么默认是JDK动态代理

在性能方面,CGLib创建的代理对象比JDK动态代理创建对象的代理要高很多。但是,CGLib在创建代理对象时所花费的时间比JDK动态代理多很多。所以对于单例对象采用CGLib动态代理比较合适,而多例对象使用JDK动态代理合适

posted @ 2022-04-10 16:24  yxhhhhhh  阅读(29)  评论(0编辑  收藏  举报