文章目录
  1. 1. Spring AOP 介绍
  2. 2. 方面
  3. 3. 目标
  4. 4. 切入点
  5. 5. 通知
  6. 6. AOP实现原理
  7. 7. 注解实现AOP

Spring AOP 介绍

AOP 为Aspect Oriented Programming的缩写,被成为面向切面编程。
AOP主要用于处理共通逻辑,例如日记记录,性能统计,安全控制,事务处理,异常处理等等。AOP可以将这些共通逻辑从普通业务逻辑代码中分离出来,这样在日后修改这些逻辑的时候就不会影响普通业务逻辑的代码。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间耦合度降低,提高程序的可重用性,同时提高了开发的效率。

方面

方面是指封装共通处理的组件,该组件被作用到其他目标组件方法上。

目标

目标是指被一个或多个方面所作用的对象。

切入点

切入点是用于指定哪些组件和方法使用方面功能,在Spring中利用一个表达式指定切入目标。
Spring提高了以下常用的切入点表达式:

  • 方法限定表达式
    execution(修饰符?返回类型 方法名(参数)throws 异常类型?)
  • 类型限定表达式
    within(包名.类型)
  • Bean名称限定表达式
    bean(”Bean的id或name属性值”)

通知

通知是用于指定方面组件和目标组件作用的时机。例如方面功能在目标方法之前或之后执行等时机。
Spring框架提供以下几种类型的通知:

  • 前置通知:先执行方面功能再执行目标功能
  • 后置通知:先执行目标功能再执行方面功能(目标无异常才执行方面)
  • 最终通知:先执行目标功能在执行方面功能(目标有无异常都执行方面)
  • 异常通知:先执行目标,抛出后执行方面
  • 环绕通知:先执行方面前置通知,然后执行目标(ProceedingJoinPoint.proceed()),最后再执行方面后置部分

AOP实现原理

Spring AOP实现主要是基于动态代理技术。当Spring采用AOP配置后,Spring容器返回的目标对象,实际上是Spring利用动态代理技术生成的一个代理类型,代理类重写了原目标组件方法的功能,在代理类中调用方面对象功能和目标对象功能。两种动态代理实现:

  • 利用cglib工具包
  • 利用JDK Proxy API

注解实现AOP

开发步骤:

  1. 创建方面组件
    —创建一个类,充当方面组件,实现统用业务逻辑。
  2. 声明方面组件
    —在applicationContext.xml中开启AOP注解扫描:aop:aspectj-autoproxy/
    —使用@Component注解标识这个类,将其声明为组件。
    —使用@Aspect注解标识这个类,将其声明为方面组件。
  3. 使用方面组件
    —在组件的方法上,使用注解将方面组件作用到目标组件的方法上,并设置通知类型以确认方面组件调用的时机。
  • 前置通知,方面组件方法上增加注解:
    @Before(“within(controller..*)”)
    public void log(){}
  • 后置通知、最终通知使用方法与前置一致,只需将注解改为@AfterReturning、@After即可。
  • 环绕通知
    @Around(“within(controller..*)”)
    public Object log(ProceedingJoinPoint p)throws Throwable{
    //此处代码在目标组件前执行
    Object obj=p.proceed();//执行目标组件方法
    //此处代码在目标组件后执行
    return obj;
    }
  • 异常通知:
    @AfterThrowing(pointcut=”within(controller..*)”,throwing=”e”)
    public void log(Exception e){}
文章目录
  1. 1. Spring AOP 介绍
  2. 2. 方面
  3. 3. 目标
  4. 4. 切入点
  5. 5. 通知
  6. 6. AOP实现原理
  7. 7. 注解实现AOP