SpringBoot中的AOP

发布时间 2023-09-11 11:39:37作者: AmorFati404
组长的任务罢了

基本概念

AOP为Aspect Oriented Programming,AOP是OOP的延续

利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

{%mermaid%}
graph TD
SpringBoot[SpringBoot] -->IOC(IOC)
SpringBoot[SpringBoot] -->V(AOP)

  • Pointcut(切点):用于定义哪个方法会被拦截,例如 execution(* cn.springcamp.springaop.service.*.*(..))
  • Aspect(切面): Aspect声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
  • Join Point(连接点): 执行Pointcut的一个实例,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
  • Advice(增强): 拦截到方法后要执行的代码
    • before advice, 在 join point 前被执行的 advice. 虽然 before advice 是在 join point 前被执行, 但是它并不能够阻止 join point 的执行, 除非发生了异常(即我们在 before advice 代码中, 不能人为地决定是否继续执行 join point 中的代码)
    • after return advice, 在一个 join point 正常返回后执行的 advice
    • after throwing advice, 当一个 join point 抛出异常后执行的 advice
    • after(final) advice, 无论一个 join point 是正常退出还是发生了异常, 都会被执行的 advice.
    • around advice, 在 join point 前和 joint point 退出后都执行的 advice. 这个是最常用的 advice.
    • introduction,introduction可以为原有的对象增加新的属性和方法。
    • 顺序:

graph LR

A[Before advice]
C-->B
B[Around advice]-->C[joinPoint]
A-->B
B-->D[After return advice]
D-->E[After advice]
E-->|Exception|F(After throwing advice)

  • Weaver: 实现AOP的框架,例如 AspectJ 或 Spring AOP

应用场景

日志记录,性能统计,安全控制,权限管理事务处理异常处理,资源池管理

web层级

{%mermaid%}

graph LR

A[Controller] -->B(Service)

B --> C{dao}

C -->D[entity]

C -->E[database]

D-->E
E-->D

{%endmermaid%}
Talk Is Cheap, Show Me Code

参考链接

Spring AOP是什么?为什么要有Spring AOP?

SpringBoot项目中使用AOP的方法

SpringBoot切面Aop的demo简单讲解