Spring AOP在项目中的典型应用场景
admin
2024-03-26 16:11:10
0

学过 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 并不是屠龙术,而是在日常开发中有着广泛应用的技术。

相关内容

热门资讯

小棉袄电商洞察:短保零食爆火背... 当整个零食赛道还在价格战的泥潭里贴身肉搏时,长沙街头的一抹红蓝撞色,正用“新鲜”二字,悄然改写着游戏...
金价高位“吞没”!美元强势+获... 汇通财经APP讯——周三(2月26日)亚市早盘,现货黄金窄幅震荡,目前交投于5150美元/盎司附近。...
大疆反击美国禁令! 据路透社报道,中国无人机制造商大疆(DJI)周二表示,已提起诉讼,对美国联邦通信委员会(FCC)禁止...
AI算力需求刺激存储芯片股 兆... 来源:财联社 财联社2月24日讯(编辑 胡家荣)受益于海外市场消息利好,港股存储概念股走强。截至发稿...
2026年中国十大杰出品牌战略... 2026年,中国经济 将 在新质生产力驱动下稳健前行, 中国 企业竞争从产品、渠道层面升级为品牌心智...
原创 特... 一直以来,中美关系始终处于紧张状态,外部局势难以化解,特朗普却在国内遭遇了前所未有的压力。2月20日...
“红利+”指数集体涨超1%,关... 截至午间收盘,中证红利指数、国证价值100指数、国证自由现金流指数均上涨1.6%。Wind数据显示,...
ETF盘中资讯|低吸时刻?科创... 或被海外AI情绪错杀,重点布局国产AI产业链的科创人工智能ETF(589520)连跌两日,场内价格现...
哈登20分米切尔23分 骑士大... 【搜狐体育战报】北京时间2月25日NBA常规赛,主场作战的骑士以109-94击败尼克斯。阿伦19分1...
科创京津冀|十二年“聚链成群”... 2026年,京津冀协同发展迎来12周年。十二年时间,足够一个产业完成从“点”到“链”的蜕变。 早在2...
金价高位震荡!实探深圳水贝市场... 2月24日,农历正月初八,深圳水贝贵金属市场在春节“不打烊”的喧嚣后,迎来了马年首个正式工作日。尽管...
日照国资内部大调整:城投集团1... 经济导报记者 杨佳琪 2月24日,日照城投集团有限公司(下称“日照城投集团”)发布关于控股股东发生变...
南京商业大佬正式入主南通这家上... 2月24日晚间,南通上市公司*ST金灵披露公司控股股东和实际控制人变更的提示性公告。 根据《重整计划...
高特电子股权合规疑云:董事牵线... 来源丨时代商业研究院 作者丨陆烁宜 编辑丨郑琳 高校教师隐秘入股、其兄牵线融资获顾问费且获得员工持股...
大市“开门红”,白酒逆市调整,... 春节假期后首个交易日,白酒走出了“逆市”行情。 2月24日,A股大盘高开并收盘企稳4100点以上,但...
别让声誉危机,成为你融资路上的... 资本市场从来没有“温情脉脉”,只有“优胜劣汰”的残酷法则。一句广为流传的警示,道尽了企业发展的隐秘风...
钨价上涨颠覆传统逻辑,APT破... 2月25日,据中钨在线最新消息,一年来,钨价的高强度和快节奏走势,已基本颠覆了原有市场传统的交易逻辑...
波兰经济学教授:美国关税政策混... 美国最高法院20日裁定美国《国际紧急经济权力法》未授权总统大规模征收关税,美国总统特朗普当天宣布将对...
暴跌54%!非洲“一哥”跌落神... 作者:曾有为 那个曾经在非洲所向披靡、被誉为“手机中的战斗机”的传奇公司,在2026年初,交出了一份...
5个月内两次更替,涪陵榨菜迎“... 瑞财经 刘治颖 2月13日,涪陵榨菜(SZ002507)公告,提名夏强伟担任公司总经理,公司董事长、...