哈囉大家好,我是古古。
在前面的文章中,我們有介紹了 Spring IoC 的特性,先讓大家了解要如何在 Spring Boot 中創建、注入、以及初始化 Bean,為後續的部分打穩基礎。
那麼從這篇文章開始,我們就會接著來介紹 Spring 框架中的另一個也很重要的特性,也就是 AOP,所以我們就開始吧!
AOP 的全稱是 Aspect-Oriented Programming,中文翻譯成「切面導向程式設計」或是「剖面導向程式設計」,而 AOP 的概念,就是「透過切面,統一的去處理方法之間的共同邏輯」。
這個「切面」聽起來可能有點抽象,所以我們就先透過一個例子,來了解一下 AOP(切面導向程式設計)到底是什麼。
假設我們有一個 HpPrinter,並且在這個 HpPrinter 裡面只有一個 print()
方法,在 console 上印出傳進來的參數:
如果我們想要測量一下「執行 print()
方法需要花費多久的時間」的話,那麼最簡單的做法,就是直接在這個方法的最前面和最後面,分別去記錄開始時間和結束時間,最後再將這兩個時間相減,就可以計算出 print()
方法總共執行多久了。
不過,雖然透過上面的寫法,是可以測量出 print()
方法的運作時間沒錯,但是大家如果觀察一下這段程式的話,就可以發現在這個 print()
方法裡面,充斥了許多跟「印東西」這個功能無關的程式。
像是原本這個 print()
方法,他本來要做的事情,就只是在 console 上面輸出「HP 印表機: ..….」這一行資訊而已,但是因為我們想要測量 print()
方法的執行時間,所以加了許多不相關的程式進去,進而讓這個方法變得很複雜,不利於後續的程式維護。
而且上面這樣子的寫法,也有可能會產生「過多程式重複」的問題。
譬如說我們在 HpPrinter 裡面多新增了一個方法 printColor()
,然後我們也想要去測量這個 printColor()
方法的時間的話,那我們就得從 print()
方法中複製所有測量時間的程式,然後貼到 printColor()
方法裡面。
現在只有這兩個方法要測量時間,所以這樣的複製貼上大家可能覺得還好,但是如果有很多方法都需要測量執行時間時,這樣子的複製貼上就不會是一個好選項。
所以為了解決這個問題,Spring AOP 就登場了!
我們可以透過下面這張圖來看一下,Spring AOP 是如何解決上面那個複製貼上的問題的。
如果我們把剛剛的 HpPrinter 畫成圖的話,就可以畫成是下面這個樣子:
上圖中呈現了 HpPrinter 中的兩個方法:print()
和 printColor()
,每一個箭頭代表的是一個方法,而箭頭右邊的程式,就是這個方法裡面所寫的程式。
在這張圖中可以看到,在這兩個方法裡面,一開始都會去記錄方法的開始時間,接著去執行「印東西」的程式,最後再是去記錄方法的結束時間,並且將結束時間和開始時間相減,計算總共執行多久。
所以這時候,Spring AOP 就提出一個想法了,既然這些測量時間的程式是每個方法都要使用的共同邏輯,那我們就把這些共同邏輯的程式,去獨立出來成一個「切面」,由這個切面去橫貫所有的方法,替他們做測量時間的部分。
所以當我們使用了 Spring AOP 之後,我們就不用在方法裡面再去寫上任何測量時間的程式了!我們只要將測量時間的共同邏輯,統一的交給切面去做處理,這個切面會去橫貫所有的的方法,分別去測量每一個方法的執行時間,所以每個方法就只要專注在各自要做的事情就好了,讚!!
而這種使用「切面」的寫法,就會稱為 AOP,也就是 Aspect-Oriented Programming(切面導向程式設計)了!
大概了解了 Spring AOP 的概念之後,我們也可以回頭來看一下 AOP 的定義。
AOP 的全稱是 Aspect-Oriented Programming,中文翻譯成「切面導向程式設計」或是「剖面導向程式設計」,而 AOP 的概念,就是「透過切面,統一的去處理方法之間的共同邏輯」。
因此當我們使用了 AOP 之後,就再也不用去複製貼上程式了,我們只需要在切面中寫好測量時間的程式,之後就可以在任何地方去使用這個切面,讓這個切面替我們完成測量時間的功能了,讚啦!
這篇文章我們先透過測量時間的例子,介紹了 Spring AOP 的原理,讓大家更好去理解 Spring AOP 的核心概念是什麼(切面真是一個神奇的東西)。
那麼下一篇文章,我們就會實際到 IntelliJ 中,練習要如何在 Spring Boot 程式中實作 Spring AOP,那我們就下一篇文章見啦!
補充:本文是擷取自我開設的線上課程 「Java 工程師必備!Spring Boot 零基礎入門」 的內容,如果你想了解更多的 Spring Boot 的用法,歡迎參考課程簡介 (輸入折扣碼「HH202504KU」即可享 85 折優惠)。