成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring AOP在項目中的典型應用場景

開發 項目管理
對于聲明式事務,直接用現成的注解就行了,但是本質上也是 AOP,如果有小伙伴在 Spring 的 XML 中配置過事務的話,就知道這個東西底層也是 AOP。

學過 Spring 的小伙伴相信都知道 AOP,AOP 學的好的小伙伴相信對 AOP 的概念也是輕車熟路:面向切面編程、切點、切面、通知,Aspect、Pointcut、Advice 等如數家珍。

AOP 之所以這么重要,是因為它在項目中有著非常廣泛的應用,今天這篇文章,松哥就來和大家總結一下,我們在日常開發中,都有哪些典型場景需要用到 AOP。

先來一句話總結下,AOP 的使用,基本上都會涉及到自定義注解,一個非常常見的組合,就是自定義注解+AOP。

在日常的開發中,有很多重復的代碼,我們總是希望將之簡化,AOP 就是一個非常常用的簡化手段。簡化的思路一般是這樣:

  • 首先,自定義一個注解。
  • 定義 AOP 切面,在切面中,定義切點和通知,切點,也就是方法的攔截規則,我們可以按照注解來攔截,也就是某一個帶有自定義注解的方法,將被我攔截下來。
  • 攔截下來之后,前置通知、后置通知、異常通知、返回通知還是環繞通知,就可以隨便寫了。

所以,這些涉及到自定義注解的地方,基本上都可以算是 AOP 的使用場景了,因為自定義注解,需要用 AOP 來解析。

接下來我們來看幾個比較典型的例子。

1. 冪等性處理

接口冪等性的處理,其實有很多種不同的方案,例如:

  • Token 機制
  • 去重表
  • 利用 Redis 的 setnx
  • 設置狀態字段
  • 上鎖

無論是哪種方案處理冪等性,每個方法里邊都去寫一遍冪等性的處理顯然是不現實的,因此,一般都是將冪等性的處理通過自定義注解+AOP給封裝起來,大致的思路如下:

首先自定義一個注解。

自定義切點,攔截所有加了自定義注解的方法。

定義環繞通知,在環繞通知中,先通過上述五種思路中的任意一種,對方法執行的冪等性進行判斷,判斷通過了,再執行目標方法,判斷不通過,則直接拋出異常,不執行目標方法。

這就是自定義注解+AOP 的一個典型應用場景。

2. 接口限流

對于接口限流,目前來說,一個比較成熟的方案是使用 Alibaba 的 Sentienl,簡單配置一下就可以實現接口限流了。

但是如果沒有用這個工具呢?如果是我們自己寫呢?毫無疑問,還是自定義注解+AOP,思路大致如下:

  • 自定義注解。
  • 在需要進行限流的接口方法上添加自定義注解,同時還可以設置一些限流的參數,例如時間窗口值、流量大小等。
  • 自定義切點,攔截規則就是所有添加了自定義注解的方法,攔截到方法之后,在環繞通知中,可以通過 Redis 插件 redis-cell、通過漏斗算法去處理限流,這個我這里就不羅嗦了,之前的文章中都寫過了。限流計算沒問題的話,就執行目標方法,否則將操作攔截下來。

大致思路如上,說白了就是自定義注解+ AOP,道理雖然簡單,但是真正做起來,還是有很多細節。

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 并不是屠龍術,而是在日常開發中有著廣泛應用的技術。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2015-08-04 15:21:17

SDN公有云軟件定義網絡

2020-02-25 22:08:02

ZooKeeper典型應用場景

2015-10-09 10:12:23

ZooKeeper

2023-12-08 08:29:53

SpringAOP日志

2013-07-27 20:11:27

2021-09-26 05:38:16

云計算云計算環境云應用

2024-12-31 07:56:33

Disruptor內存有界隊列消費模式

2015-10-15 14:32:34

2021-03-03 10:11:16

區塊鏈商業工業

2012-10-23 09:32:07

2020-08-14 10:00:34

Node前端應用

2011-05-17 15:24:18

Shibboleth認證

2017-07-08 13:48:19

虛擬化云計算在線遷移

2020-10-16 09:09:20

機器學習銀行技術

2022-09-05 14:46:01

元宇宙區塊鏈人工智能

2009-06-29 15:51:48

Spring容器

2018-05-06 22:53:36

物聯網NB-IOT窄帶物聯網

2017-11-27 09:11:42

SSDceph應用

2014-12-10 10:36:23

IaaS云應用場景
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线视| 蜜桃视频一区二区三区 | 精品美女视频在免费观看 | 国产在线精品免费 | 久久a久久 | 国产精品视频一二三区 | 欧美精品久久久久久久久久 | 亚洲不卡在线观看 | 国产精品视频区 | 成人免费一区二区三区视频网站 | 精品国产乱码久久久久久蜜柚 | 久久久久中文字幕 | 国产午夜精品一区二区三区在线观看 | 国产综合久久 | 精品国产网| 亚洲一区播放 | 99国产精品99久久久久久 | 99热精品久久 | 成人在线免费网站 | 亚洲国产精久久久久久久 | 在线视频成人 | 亚洲视频免费播放 | 欧美一级毛片在线播放 | 婷婷去俺也去 | 日韩一区精品 | 9久久婷婷国产综合精品性色 | 日韩午夜| www.久草 | 免费国产视频 | 国产精品久久国产精品久久 | 亚洲福利电影网 | a级片在线观看 | 日韩久久久久久 | 国产伦精品一区二区三区精品视频 | 在线观看av网站永久 | 日韩综合网 | 日本黄色大片免费看 | 91福利在线观看视频 | 黄视频免费 | 视频一区二区三区中文字幕 | 91精品一区二区三区久久久久 |