学过 Spring 的小伙伴信任都知道 AOP,AOP 学的好的小伙伴信任对 AOP 的概念也是驾轻就熟:面向切面编程、切点、切面、告诉,Aspect、Pointcut、Advice 等如数家珍。

AOP 之所以这么重要,是由于它在项目中有着十分广泛的运用,今日这篇文章,松哥就来和大家总结一下,咱们在日常开发中,都有哪些典型场景需求用到 AOP。

先来一句话总结下,AOP 的运用,基本上都会涉及到自界说注解,一个十分常见的组合,便是自界说注解+AOP。

在日常的开发中,有许多重复的代码,咱们总是期望将之简化,AOP 便是一个十分常用的简化手段。简化的思路一般是这样:

  1. 首要,自界说一个注解。
  2. 界说 AOP 切面,在切面中,界说切点和告诉,切点,也便是办法的阻拦规矩,咱们能够依照注解来阻拦,也便是某一个带有自界说注解的办法,将被我阻拦下来。
  3. 阻拦下来之后,前置告诉、后置告诉、反常告诉、返回告诉仍是盘绕告诉,就能够随便写了。

所以,这些涉及到自界说注解的地方,基本上都能够算是 AOP 的运用场景了,由于自界说注解,需求用 AOP 来解析。

接下来咱们来看几个比较典型的比如。

1. 幂等性处理

接口幂等性的处理,其实有许多种不同的计划,例如:

  1. Token 机制
  2. 去重表
  3. 利用 Redis 的 setnx
  4. 设置状况字段
  5. 上锁

无论是哪种计划处理幂等性,每个办法里面都去写一遍幂等性的处理显然是不现实的,因而,一般都是将幂等性的处理经过自界说注解+AOP给封装起来,大致的思路如下:

  1. 首要自界说一个注解。
  2. 自界说切点,阻拦所有加了自界说注解的办法。
  3. 界说盘绕告诉,在盘绕告诉中,先经过上述五种思路中的任意一种,对办法履行的幂等性进行判别,判别经过了,再履行方针办法,判别不经过,则直接抛出反常,不履行方针办法。

这便是自界说注解+AOP 的一个典型运用场景。

假如你对上面的表述云里雾里,无妨看看松哥之前发的这个视频,有具体的手把手教程:处理接口幂等性的两种常见计划|手把手教你。

2. 接口限流

关于接口限流,目前来说,一个比较老练的计划是运用 Alibaba 的 Sentienl,简略装备一下就能够完结接口限流了。

可是假如没有用这个工具呢?假如是咱们自己写呢?毫无疑问,仍是自界说注解+AOP,思路大致如下:

  1. 自界说注解。
  2. 在需求进行限流的接口办法上增加自界说注解,同时还能够设置一些限流的参数,例如时刻窗口值、流量大小等。
  3. 自界说切点,阻拦规矩便是所有增加了自界说注解的办法,阻拦到办法之后,在盘绕告诉中,能够经过 Redis 插件 redis-cell、经过漏斗算法去处理限流,这个我这里就不罗嗦了,之前的文章中都写过了。限流核算没问题的话,就履行方针办法,不然将操作阻拦下来。

大致思路如上,说白了便是自界说注解+ AOP,道理虽然简略,可是真实做起来,仍是有许多细节,感兴趣的小伙伴能够参阅松哥之前的这篇文章:Redis 做接口限流,一个注解的事!。

3. 日志处理

说到 AOP,所有人都能想到的运用场景了,这个我就不罗嗦了,松哥之前也有过专门的文章介绍,没看过的小伙伴们戳这里:记载项目日志,一个注解搞定。

4. 多数据源处理

有时分咱们项目中存在多个不同的数据源,在实际运用中需求进行切换,网上也有一些开源的解决计划,不过这个东西其实并不难,咱们也能够自己写。

自界说多数据源的处理,大致上思路如下:

从 Spring2.0.1 中引入了 AbstractRoutingDataSource 类,(注意是 Spring2.0.1 不是 Spring Boot2.0.1,所以这其实也算是 Spring 一个十分陈旧的特性了), 该类充当了 DataSource 的路由中介,它能够在运行时, 根据某种 key 值来动态切换到真实的 DataSource 上。

大致的用法便是你提前准备好各种数据源,存入到一个 Map 中,Map 的 key 便是这个数据源的姓名,Map 的 value 便是这个具体的数据源,然后再把这个 Map 装备到 AbstractRoutingDataSource 中,最后,每次履行数据库查询的时分,拿一个 key 出来,AbstractRoutingDataSource 会找到具体的数据源去履行这次数据库操作。

根据以上知识,咱们能够自界说一个注解,在需求切换数据源的办法上,增加这个注解,然后经过 AOP 去解析这个自界说注解,当方针办法被阻拦下来的时分,咱们跟进注解中的装备,重新设置要履行的数据源,这样将来 service 中的办法在履行的过程中,就会运用到切换之后的数据源了。

思路并不难,松哥之前也写过具体的教程,小伙伴们参阅这里:

  • 手把手教你玩多数据源动态切换!
  • 网页上点一下,就能切换不同数据源?松哥手把手教你!

5. 办法权限处理

这个其实也跟前面的差不多。

办法等级的权限处理,一般来说也是根据注解来完结的。假如你运用了 Spring Security 之类的权限结构,就不必自己解析权限注解了,依照结构的要求直接来运用就行了。

有的时分,咱们或许没有运用 Spring Security,想自己处理权限注解,也是能够的。用户自界说权限注解,为注解增加特点,然后将注解增加到方针办法上,再经过 AOP 去解析这个注解,AOP 将方针办法的履行阻拦下来,然后判别用户是否具有所需求的权限,假如具有,就履行方针办法,不然就不履行。

前两天松哥刚刚分享的在微服务中,服务内部的权限校验,便是自界说一个注解,将从其他微服务上来的恳求给阻拦下来,然后判别恳求的来历,假如是从其他微服务上来的,就履行方针办法,假如不是从其他微服务上来的,而是从外部来的恳求,那么就将之阻拦下来抛出反常,不履行方针办法,参见:微服务中的鉴权该怎么做?。

6. 业务处理

这个却是不需求自界说注解,关于声明式业务,直接用现成的注解就行了,可是本质上也是 AOP,假如有小伙伴在 Spring 的 XML 中装备过业务的话,就知道这个东西底层也是 AOP。

好啦,梳理了几个简略的案例,期望小伙伴们了解到 AOP 并不是屠龙术,而是在日常开发中有着广泛运用的技术。