Spring学习(四)---Spring Aop基础

一 Aop概述

AOP(面向切面编程),是用来处理业务处理模块和非业务模块横向分离出来的问题。

1.AOP术语

~连接点(Joinpoint)
一个类或一段程序代码拥有一些具有边界性质的特定点。确定连接点的两个信息是:1用方法表示的程序执行点;2.用相对点表示的方法。
~切点(Pointcut)
  AOP通过切点来定位符合要求的连接点。
~增强(Advice)
  在Spring中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这边是执行点的方位。结合执行点方位信息和切点信息,我们就可找到特定的连接点。
~目标对象(Target)
  增强逻辑的织入目标类。
~引介(Introduction)
引介是一种特殊的增强,它为类添加一些属性好人方法。
~织入(Weaving)
  织入是讲增强添加对目标类具体连接点上的过程,AOP像一台织布机,将目标类,增强或引介通过AOP这台织布机天衣无缝的编织到一起。根据不同的实现技术,AOP有三种织入方式:
  • 1)编译期织入,这要求使用特殊的Java编译器
  • 2)类装载期编入,这要求使用特殊的类装载器
  • 3)动态代理织入,在运行期为目标类添加增强生成子类的方式。

  Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
~代理(Proxy)
  一个类被AOP织入增强后,就产出一个结果类,它是融合了原类和增强逻辑的代理类。
~切面(Aspect)
切面由切点和增强(引介)组成,它既包括了横切逻辑的定义,也包括了连接点的定义,Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。

  AOP的工作重心在于如何将增强应用于目标对象的连接点上,这里首先包括两个工作:第一,如何通过切点和增强定位到连接点上;第二,如何在增强中编写切面的代码。

  面向切面编程,主要在“切面”两个字。实际上,就是把方法内部非业务逻辑部分抽离出来,放到一个特定的地方,通过代理类和反射机制将业务逻辑和非业务逻辑部分载重新组合到一起。

  Spring AOP的底层就是通过使用JDK动态代理或CGLib动态代理技术为目标Bean织入横切逻辑。SpringAOP通过Pointcut(切点)指定在哪些类的哪些方法上织入横切逻辑,通过Advice(增强)描述横切逻辑和方法的具体织入点(方法前,方法后,方法放入两端等)此外,SPring通过Advisor(切面)将pointcut和Advice两者组装起来。有了Advisor的信息,Spring就可以利用JDK或CGLib的动态代理技术同一的方式为目标Bean创建织入切面的代理对象了。

二 创建增强类



  带《spring》标识的接口是Spring所定义的扩展增强接口;带《aopalliance》标识的接口则是AOP联盟定义的接口。按照增强在目标类方法的连接点位置,可以分为以下5类:
  • 前置增强:org.springframework.aop.BeforeAdvice
  • 后置增强:org.springframework.aop.AfterReturningAdvice
  • 环绕增强:org.aopalliance.intercept.MethodInterceptor
  • 异常抛出增强:org.springframework.aop,ThrowsAdvice.表示在目标方法抛出异常后实施增强
  • 引介增强:org.springframework.aop.IntroductionInterceptor,表示在目标类中天街一些新的方法和属性。


三 创建切面
1. 切点类型
Spring提供了六种类型切点:
  • 静态方法切点:org.springframework.aop.support.StaticMethodMatcherPointcut是金泰方法切点的抽象基类,默认情况小它匹配所有的类。StaticMethodMatch而PointCut包括两个主要的子类,分别是NameMatchMethodPointcut和AbstractRegexpMethodPointcut,前者提供简单字符串匹配方法签名,而后者使用正则表达式匹配方法签名;
  • 动态方法切点:org.springframework.aop.support.DynamicMethodMatcherPointcut是动态方法切点的抽象基类,默认情况下匹配所有的了。
  • 注解切点:org.springframework.aop.support.AnnotationMatcherPointcut
  • 表达式切点:org.springframework.aop.support.ExpressionPointcut接口主要是为了支持AspectJ切点表达式语法而定义的接口;
  • 流程切点:org.springframework.aop.support.COntrolFlowPointcut实现类表示控制流程切点。ControlFlowPointcut是一种特殊的切点,它根据程序执行堆栈的信息查看目标方法是否由一个方法直接或间接发起调用,以此判断是否为匹配的连接点;
  • 复合切点:org.springframework.aop.support.ComposablePointcut实现类是为了创建多个切点而提供的方便操作类。


2.切面类型
  切面类型有三类:一般切面,切点切面,引介切面,一般切面很少用,引介切面和引介增强类似。

猜你喜欢

转载自happiness0617.iteye.com/blog/2299781
今日推荐