iT邦幫忙

2023 iThome 鐵人賽

DAY 11
2
Software Development

Spring Boot 零基礎入門系列 第 11

Spring Boot 零基礎入門 (11) - Spring AOP 簡介

  • 分享至 

  • xImage
  •  

賀!此系列文榮獲 2023 iThome 鐵人賽《優選》獎項,正在規劃出書中,感謝大家的支持🙏,同名課程「Java 工程師必備!Spring Boot 零基礎入門」也已在 Hahow 平台上架

哈囉大家好,我是古古

在前幾篇文章中,我們已經了解了 Spring 框架中的 IoC 特性,那麼從這篇文章開始,我們就會接著來了解 Spring 框架中的另一個特性,也就是 AOP

什麼是 Spring AOP?


AOP 的全稱是 Aspect-Oriented Programming,中文是翻譯成「切面導向程式設計」或是「剖面導向程式設計」,那我們一樣是可以透過一個例子,來介紹 AOP (切面導向程式設計) 到底是什麼

https://ithelp.ithome.com.tw/upload/images/20230925/20151036oPeu8vDick.png

例子:測量時間的故事

假設我們有一個 HpPrinter,並且在這個 HpPrinter 裡面只有一個 print() 方法,在 consoel 上印出傳進來的參數

https://ithelp.ithome.com.tw/upload/images/20230925/20151036XzluBRw5DG.png

如果我們想要去測量執行這個 print() 方法需要多長的時間,那我們可以在這個方法的最前面和最後面,去記錄當下的開始時間和結束時間,最後就可以去計算出 print() 方法總共執行了多久

https://ithelp.ithome.com.tw/upload/images/20230925/20151036bhtML4qDmh.png

雖然我們透過上面的寫法,是可以去測量 print() 方法的運作時間沒錯,但是大家如果觀察一下這段程式的話,就可以發現在這個 print() 方法裡面,充斥了許多跟「印東西」這個功能無關的程式

像是這個 print() 方法,他本來要做的事情,其實只是在 console 上面輸出「HP 印表機: ....」的這一行資訊而已,但是因為我們想要去測量時間,所以就加了很多不相關的程式進去,進而讓這個方法變得很複雜,不利於後續的程式維護

https://ithelp.ithome.com.tw/upload/images/20230925/20151036Qr3iuSAnoS.png

而且這樣子寫還會有一個衍生的問題,譬如說我們在 HpPrinter 裡面多新增了一個方法 printColor(),然後我們也想要去測量這個 printColor() 方法的時間的話,那我們就得複製貼上所有測量時間的程式到 printColor() 方法裡面

現在只有這兩個方法要測量時間,所以這樣複製貼上可能覺得還好,但是如果當很多方法都需要測量執行時間的時候,這樣子的複製貼上就不會是一個好選項

https://ithelp.ithome.com.tw/upload/images/20230925/20151036mNzkfoHP4c.png

所以為了解決這個問題,Spring AOP 就登場了!

透過 AOP(切面)來輔助

我們可以來用一張圖來看一下,Spring AOP 是如何解決上面那個複製貼上的問題的

如果我們把剛剛的 HpPrinter 畫成圖的話,就會變成是下面這個樣子:

https://ithelp.ithome.com.tw/upload/images/20230925/20151036sCdWN7MXvT.png

在上圖中呈現了 HpPrinter 中的 2 個方法:print()printColor(),每一個箭頭代表的是一個方法,而箭頭右邊的程式碼就是這個方法裡面所寫的程式

在這張圖也可以看到,在這兩個方法裡面,最一開始都會去記錄方法的開始時間,後面則是去記錄方法的結束時間,最後並且把結束時間和開始時間相減,去取得這個方法的執行時間

那這時候,Spring AOP 就提出一個想法了,既然這些測量時間的程式是每個方法都要使用的共同邏輯,那我們就把這些程式,去獨立出來成一個「切面」,由這個切面去橫貫所有的方法,替他們做測量時間的部分

https://ithelp.ithome.com.tw/upload/images/20230925/201510360jVzj6ewX9.png

所以當我們使用了 Spring AOP 之後,我們就不用在方法裡面加上任何測量時間的程式了!我們只要將測量時間的共同邏輯,統一的交給切面去做處理,這個切面會去橫貫所有的的方法,分別去測量每一個方法的執行時間,所以每個方法就只要專注在各自要做的事情就好,世界和平!!

而這樣子使用切面的寫法,就會稱作是 AOP,也就是 Aspect-Oriented Programming (切面導向程式設計)

Spring AOP 的定義


透過上面這個例子了解 Spring AOP 的概念之後,我們可以回頭再看一下 AOP 的定義

AOP 的全稱是 Aspect-Oriented Programming,中文是翻譯為「切面導向程式設計」或是「剖面導向程式設計」,而 AOP 的概念,就是「透過切面,統一的去處理方法之間的共同邏輯」

因此當我們使用了 AOP 之後,就再也不用去複製貼上程式了,我們只只需要在切面裡面寫好測量時間的程式,之後就可以在任何地方去使用這個切面,讓這個切面替我們完成測量時間的功能,讚啦!

總結


這篇文章先透過例子介紹了 Spring AOP 的原理,讓大家更好去理解 Spring AOP 的概念

那麼下一篇文章,就會來介紹要如何在 Spring Boot 中使用 Spring AOP 的功能,那我們就下一篇文章見啦!

相關連結



上一篇
Spring Boot 零基礎入門 (10) - 讀取 Spring Boot 設定檔 - @Value
下一篇
Spring Boot 零基礎入門 (12) - Spring AOP 的用法 - @Aspect
系列文
Spring Boot 零基礎入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
凱文大叔
iT邦新手 5 級 ‧ 2023-11-04 09:40:32

能用到AOP才是真的摸透Springboot

我要留言

立即登入留言