聊完了工廠模式,下面我們來說Spring框架中的另一個核心設計模式——代理模式(Proxy Pattern)。
代理模式
大家可以先不用看概念,先舉個吃飯的例子:比如說我們想吃飯,我們可以選擇自己做飯吃、去飯店吃、叫外賣吃。如果我們選擇自己做著吃,我們就需要去買菜、做飯、吃飯、吃完飯還要刷碗。其實我們真正想做的就只有吃飯而已,其他的都是與業務無關,但是又不得不做的事。但是我們叫外賣就不一樣了,外賣小哥會把飯送到我們手裡,吃完飯我們也不需要刷碗,直接把包裝扔掉就可以了,我們這裡先不討論環保的問題。這裡的外賣小哥就相當於是我們的代理。代理我們去飯店,或者買菜的過程。
有了代理我們就可以更專注於我們真正要做的事–吃飯。代理可以幫我們把一些髒活累活全都幹了。
在我們寫程式碼過程中那些是髒活累活呢?
舉個最簡單的例子:在JDBC中,當我們完成資料庫操作之後,我們還要關閉一堆Connection、Statement、ResultSet而且每個都還要判空,還要捕獲異常,要多麻煩有多麻煩。有了代理我們就可以把這些都交給代理去做,自己只做最核心的業務邏輯就可以了。
當然代理模式還有一些其他的用途:
- 日誌管理;
- 事務控制;
- 許可權管理;
那麼有人就會問了:代理模式最終不是還是得我們自己實現嗎?既然這樣,我們直接將這些邏輯直接寫在程式碼內部反而更簡單了呢?
這就涉及到兩種代理模式的分類:靜態代理和動態代理。雖然他們的理論都是一致的,但是在實現方式上面卻迥然不同。
靜態代理: 每當我們想代理一個類,我們就要為這個類建立一個相應的代理類,讓它在我們的業務基礎上做一些瑣碎的事,但是這就像上面的朋友的疑問一樣,我們直接將這些邏輯直接寫在程式碼內部反而更簡單。但是這並不代表靜態代理就是一無是處。至少他做到了,業務程式碼與其他程式碼的分離。並且靜態代理也是我們理解動態代理的基礎。
動態代理:通過Java反射的方式為一批具有相同代理邏輯的類動態的建立代理,這樣可以大大的提高了我們的開發的效率。主要分為JDK代理和CGlib代理。但是它也有缺點,那就是實現太過於複雜。
但是Spring框架卻為我們克服了動態代理的缺點,使我們不需要在考慮動態代理的編寫,而是為我們自動生成動態代理,讓我們開發變得更加如魚得水。下一篇我們就直奔我們的主題具體聊聊我們的Spring框架,看它是如何做到的。
還是那句話,這裡只是記錄我個人的理解,如果大家需要更加深入的瞭解可以參考菜鳥教程.