五分钟了解下SpringAOP的应用场景和工作原理

124 阅读2分钟

SpringAOP的应用场景都有:

  • 日志记录
  • 异常处理
  • 权限验证
  • 缓存处理
  • 事务处理
  • 数据持久化
  • 效率检查
  • 内容分发

Spring AOP中关键字解释


  • aspect:切面,切面有切点和通知组成,即包括横切逻辑的定义也包括连接点的定义。
  • pointcut:切点,每个类都拥有多个连接点,可以理解是连接点的集合。
  • joinpoint:连接点,程序执行的某个特定的为知,如某个方法调用前后。
  • weaving:织入,将增强添加到目标类的具体连接点的过程。
  • advice:通知,是织入到目标类连接点上的一段代码,就是增强到什么地方?增强什么内容?
  • target:目标对象。通知织如的目标类。
  • aop Proxy:代理对象。即增强后产生的对象。

Spring AOP底层实现,是通过JDK动态代理或者CGlib代理在运行时期在对象初始化阶段织入代码的。


JDK代理和CGlib代理的区别?

  • JDK代理是基于接口实现;
  • CGlib代理是基于类的继承实现;

通知(Advice)的种类

  • Before advice 前置通知,即在目标方法调用之前执行。注意:即无论方法是否遇到异常都执行。

  • After returning advice 后置通知,在目标方法执行后执行,前提是目标方法没有遇到异常,如果有异常则不执行通知。

  • After throwing advice 异常通知,在目标放大抛出异常时执行,可以获取异常信息。

  • Afte finally advice 最终通知,在目标方法执行后执行,无论是否是异常执行。

  • Around advice 环绕通知,最强大的通知类型,可以控制目标放大的执行,(通过调用 ProceedingJoinPoint.proceed( ) ),可以再目标执行全过程中进行执行。


Aspect切面实现步骤

  • 定义一个切面类Aspect 即在声明的类,增加@Component @Aspect 两个注释,SpringBoot中要引入spring-boot-starter-aop依赖包。

  • 定义切点Poincut 定义切点,并定义切点在那些地方执行,采用@Poincut注解完成,如 @Poincut(execution((public * com.macro.mall.controller.*.*(..))) ) 规则:修饰符(public 可以不写,但不能用 * ) + 返回类型 + 那些包下的类 + 那些方法 + 方法参数 " * "代表不限 ," .. "两个点代表参数不限。

  • 定义Adevice通知 利用通知的物种类型注解 @Before、@After、@AfterReturning、@AfterThrowing、@Around来完成在某些切点的增强动作,如: @Before("myPoincut()"),myPoincut为第二步骤定义的切点。