AOP 常见使用场景
- 日志场景
- 诊断上下文,如log4j 或 logback 或 MDC (线程安全Map,临时储存一些信息)
- 辅助信息,如方法执行时间
- 统计场景
- 方法调用次数
- 执行异常次数
- 数据抽样
- 数值累加
- 安防场景
- 熔断:如:Netflix Hystrix
- 限流和降级:如:Alobaba Sentinel
- 认证和授权,如:spring security
- 监控,如:JMX
性能场景
AspectJ:Aop是一种编程方式,拦截OOP的参数和字段等
- Spring AOP:辅助完善AOP的编程模式。SpringAOP 没有编译时的一个特殊处理 ,运行时进行处理。大部分是通过反射、ASM实现。
- Spring AOP 的三种实现方式:JDK 动态代理、Cglib字节码提升、AspectJ实现
-
AOP 相关组件
Aspect:切面;Aspect 申明类似于Java中的类声明
一个 Aspact 对应多个 Join point ,一个 Join point 对应多个 Action (Advice), 一个 Advice 可以对应多种拦截的实现动作
Joint point:连接点;表示在程序中明确定义的点,典型的包括方法的调用,对类成员的访问以及异常处理程序块的执行;它自身还可以嵌套其他的 join point
- pointcut:切点;表示一组 join point ,这些 join point 或通过逻辑关系组合起来,或是通过逻辑匹配、正则表法式的方式集中起来,它定义了相应的advice将要发生的地方。
- Advice:增强;advice 定义了 pointcut 里面定义的程序点具体要做的操作;它通过 before 、after 和 around 来区别是在每个 join point之前还是之后还是代替执行的代码;
- 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可以为原有的对象增加新的属性和方法。
- Target:目标对象;织入 Advice 的目标对象.。
- Weaving:织入;将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程
AOP 概念图整合