1. 程式人生 > >理解Spring 的兩大特性(IOC和AOP)

理解Spring 的兩大特性(IOC和AOP)

Spring的核心特性就是IOC和AOP

IOC:控制反轉    AOP:面向切面程式設計

IOC:(媒婆)IOC,另外一種說法叫DI(Dependency Injection),即依賴注入。它並不是一種技術實現,而是一種設計思想。在任何一個有實際開發意義的程式專案中,我們會使用很多類來描述它們特有的功能,並且通過類與類之間的相互協作來完成特定的業務邏輯。這個時候,每個類都需要負責管理與自己有互動的類的引用和依賴,程式碼將會變的異常難以維護和極度的高耦合。而IOC的出現正是用來解決這個問題,我們通過IOC將這些相互依賴物件的建立、協調工作交給Spring容器去處理,每個物件只需要關注其自身的業務邏輯關係就可以了。在這樣的角度上來看,獲得依賴的物件的方式,進行了反轉,變成了由spring容器控制物件如何獲取外部資源(包括其他物件和檔案資料等等)。舉例:某一天,你生病了,但是你不清楚自己到底得了什麼病,你只知道自己頭疼,咳嗽,全身無力。這個時候你決定去藥店買藥,藥店有很多種藥,僅僅是治療頭疼就有好幾十種,還有西藥中藥等區別。然後你自己看了看說明書,選擇了一盒你自己覺得最能治療自己病症的藥,付錢吃藥,期待可以早點好起來。 但是這個過程,對於一個病人來說,太辛苦了。頭疼,咳嗽,全身無力,還要一個個的看藥品說明書,一個個的比較哪個藥比較好,簡直是太累了。這個時候,你決定直接去醫院看醫生。 醫生給你做了檢查,知道你的病症是什麼,有什麼原因引起的;同時醫生非常瞭解有哪些藥能治療你的病痛,並且能根據你的自身情況進行篩選。只需要短短的十幾分鍾,你就能拿到對症下藥的藥品,即省時又省力。在上面這個例子中,IOC起到的就是醫生的作用,它收集你的需求要求,並且對症下藥,直接把藥開給你。你就是物件,藥品就是你所需要的外部資源。通過醫生,你不用再去找藥品,而是通過醫生把藥品開給你。這就是整個IOC的精髓所在。AOP:(管家)
面向切面程式設計的目標就是分離關注點。什麼是關注點呢?就是你要做的事,就是關注點。假如你是個公子哥,沒啥人生目標,天天就是衣來伸手,飯來張口,整天只知道玩一件事!那麼,每天你一睜眼,就光想著吃完飯就去玩(你必須要做的事),但是在玩之前,你還需要穿衣服、穿鞋子、疊好被子、做飯等等等等事情,這些事情就是你的關注點,但是你只想吃飯然後玩,那麼怎麼辦呢?這些事情通通交給別人去幹。在你走到飯桌之前,有一個專門的僕人A幫你穿衣服,僕人B幫你穿鞋子,僕人C幫你疊好被子,僕人C幫你做飯,然後你就開始吃飯、去玩(這就是你一天的正事),你幹完你的正事之後,回來,然後一系列僕人又開始幫你幹這個幹那個,然後一天就結束了!從Spring的角度看,AOP最大的用途就在於提供了事務管理的能力。事務管理就是一個關注點,你的正事就是去訪問資料庫,而你不想管事務(太煩),所以,Spring在你訪問資料庫之前,自動幫你開啟事務,當你訪問資料庫結束之後,自動幫你提交/回滾事務!        現在我們以一個系統中的具體實現來講講AOP具體是個什麼技術。我們以系統中常用到的事務管控舉例子。在系統操作資料庫的過程中,不可避免地要考慮到事務相關的內容。如果在每一個方法中都新建一個事務管理器,那麼無疑是對程式碼嚴重的耦合和侵入。為了簡化我們的開發過程(實際上spring所做的一切實現都是為了簡化開發過程),需要把事務相關的程式碼抽成出來做為一個獨立的模組。通過AOP,確認每一個操作資料庫方法為一個連線點,這些連線點組成了一個切面。當程式執行到其中某個一個切點時,我們將事務管理模組順勢織入物件中,通過通知功能,完成整個事務管控的實現。這樣一來,所有的操作資料庫的方法中不需要再單獨關心事務管理的內容,只需要關注自身的業務程式碼的實現即可。所有的事務管控相關的內容都通過AOP的方式進行了實現。簡化了程式碼的內容,將目標物件複雜的內容進行解耦,分離業務邏輯與橫切關注點。