Spring-AOP(面向切面编程)

什么是AOP

  AOP是Spring提供的关键特性之一。AOP即面向切面编程,是OOP编程的有效补充。使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。这些系统性的编程工作都可以独立编码实现,然后通过AOP技术切入进系统即可。从而达到了 将不同的关注点分离出来的效果。
  • AOP: 面向切面编程: 目标: 增强代码(方法),   把方法横向的拆分
  • OOP: 面向对象编程: 封装,继承,多态, 把项目划分为不同模块(对象)

AOP思想:采用代理思想,在不改变原来目标代码前提下,实现功能增强!

  IoC 工厂制造对象,AOP 代码增强对象,在工厂制造对象过程中,使用代理进行对象的增强(BeanPostProcessor )

Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码,Spring2.0之后,Spring AOP引入对Aspectj的支持,AspecJ是一个基于Java语言的AOP框架.

AOP编程应用场景

  • 事务管理
  • 记录日志
  • 监测性能(统计方法运行时间)
  • 权限控制
  • 缓存

主要目的:

  将日志记录,性能统计,安全控制,事务处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

AOP相关术语

  • Joinpoint(连接点):所谓连接点是指那些被拦截到的点,在Spring中,这些点指的是方法,因为Spring只支持方法类型的连接点.
  • Pointcut(切入点):所谓的切入点是指我们要对哪些Joinpoint进行拦截的定义
  • Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的事情)
  • Introduction(引介):引介是一种特殊的通知,在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法或Field
  • Target代理的目标对象
  • Weaving(织rget(目标):入):是指把增强应用到目标对象来创建的代理对象的过程,Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
  • Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
  • Aspect(切面):是切入点和通知(引介)的结合

个人理解

Joinpoint(连接点) :一个类的所有方法
Pointcut(切入点):需要增强的这个方法
Advice(通知/增强): 对目标对象增强的代码(日志,事务,权限等)
Introduction(引介):一种特殊的通知
Target: 目标对象,需要增强方法的这个类
Weaving(织rget(目标):入): 把通知添加到这个方法中
Proxy(代理): 被代理类(一个类被AOP织入增强后,就产生一个结果代理类)
Aspect(切面):是切入点和通知(引介)的结合

 AOP的五种增强类型

前置增强:org.springframework.aop.BeforeAdvice是前置增强顶层接口,因为Spring只支持方法的增强,其子接口MethodBeforeAdvice是目前可用的前置增强。表示在目标方法执行前实施增强。
后置增强:org.springframework.aop.AfterReturningAdvice是目前可用的后置增强,表示在目标方法执行后实施增强。
环绕增强:org.aopalliance.intercept.MethodInterceptor代表了环绕增强,表示在目标方法执行前后实施增强。直接使用了AOP联盟定义的接口。
异常抛出增强:org.springframework.aop.ThrowsAdvice代表了异常抛出增强,表示在目标方法抛出异常后实施增强。
引介增强:org.springframework.aop.IntroductionInterceptor代表引介增强,表示在目标类中添加一些新的方法和属性。

Spring将introduction通知看作一种特殊类型的拦截通知。用Spring的行话来讲,对方法的增强叫做Wearing(织入),而对类的增强叫introduction(引入)。

Introduction Advice(引入增强)就是对类的功能增强,它也是Spring AOP 提供的一种特殊增强。

1)  前置增强,    增强是在目录方法之前执行

2) 后置增强,   增强是在目录方法之后执行, 目标方法没有发生异常

3) 最终增强,  不管目标方法是否有异常,都会执行

4) 异常增强,  在目标发生异常的时候,进行增强

5) 环绕增强:   一个顶替上面四个增强

 

posted @ 2020-06-11 20:55  64Byte  阅读(161)  评论(0编辑  收藏  举报