AOP

面向切面编程,将业务逻辑的各个部分进行隔离,使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性

Joinpoint(连接点)指那些被拦截到的点,在 Spring 中,可以被动态代理拦截目标类的方法。

Pointcut(切入点)指要对哪些 Joinpoint 进行拦截,即被拦截的连接点。Advice(通知)指拦截到 Joinpoint 之后要做的事情,即对切入点增强的内容。方法

Target(目标)指代理的目标对象。

Weaving(织入)指把增强代码应用到目标上,生成代理对象的过程。

Proxy(代理)指生成的代理对象。Aspect(切面)切入点和通知的结合。类

  • 横切关注点:跨越程序多个模块的方法或功能。即与业务逻辑无关,但我们也要关注的部分,就是横切关注点。如日志、安全、缓存等。
  • 切面( Aspect ):横切关注点被模块化的特殊对象;即切面应是一个类。
  • 通知( Advice):切面要完成的增强处理,通知描述了切面何时执行以及如何执行增强处理;即通知应是切面中的方法。
  • 目标( Target ):被通知对象,代理的目标对象。
  • 代理( Proxy ):向目标对象应用通知之后创建的对象。
  • 切入点( PointCut ):切面通知执行的地点,即可以插入增强处理的连接点。
  • 连接点( JoinPoint ):应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。
  • 织入( Weaving ):将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。

Spring中有五种通知 Advice

  • @Before 前置通知:方法执行之前
  • @After 后置通知:方法执行之后
  • @Around 环绕通知:方法执行前后都有通知
  • @AfterReturnning 返回通知:方法成功执行之后通知
  • @AfterThrowing 异常通知:抛出异常之后通知

JDK 动态代理Spring AOP 默认的动态代理方式,若目标对象实现了若干接口,Spring 使用 JDK 的java.lang.reflect.Proxy 类进行代理。

CGLIB 动态代理若目标对象没有实现任何接口,Spring 则使用 CGLIB 库生成目标对象的子类,以实现对目标对象的代理。implements实现MethodInterceptor方法拦截器,用于Spring AOP编程中的动态代理.实现该接口可以对需要增强的方法进行增强

Spring 通知按照在目标类方法的连接点位置,可以分为以下五种类型,

| 名称 | 说明 |
| ———————————————————– | ———————————————————— |
| org.springframework.aop.MethodBeforeAdvice(前置通知) | 在方法之前自动执行的通知称为前置通知,可以应用于权限管理等功能。 |
| org.springframework.aop.AfterReturningAdvice(后置通知) | 在方法之后自动执行的通知称为后置通知,可以应用于关闭流、上传文件、删除临时文件等功能。 |
| org.aopalliance.intercept.MethodInterceptor(环绕通知) | 在方法前后自动执行的通知称为环绕通知,可以应用于日志、事务管理等功能。 |
| org.springframework.aop.ThrowsAdvice(异常通知) | 在方法抛出异常时自动执行的通知称为异常通知,可以应用于处理异常记录日志等功能。 |
| org.springframework.aop.IntroductionInterceptor(引介通知) | 在目标类中添加一些新的方法和属性,可以应用于修改旧版本程序(增强类)。 |

使用注解实现AOP

@Aspect用于定义一个切面。

@Before用于定义前置通知,相当于 BeforeAdvice。

@AfterReturning用于定义后置通知,相当于 AfterReturningAdvice。

@Around用于定义环绕通知,相当于MethodInterceptor。

@AfterThrowing用于定义抛出通知,相当于ThrowAdvice。

@After用于定义最终final通知,不管是否异常,该通知都会执行。

@DeclareParents用于定义引介通知,相当于IntroductionInterceptor(不要求掌握)