Spring-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) 环绕增强: 一个顶替上面四个增强