深入理解Spring的兩大特徵(IOC和AOP)

2022-09-17 12:27:17 字數 3158 閱讀 2281

1.降低了元件之間的耦合性 ,實現了軟體各層之間的解耦

2.可以使用容易提供的眾多服務,如事務管理,訊息服務等

3.容器提供單例模式支援

4.容器提供了aop技術,利用它很容易實現如許可權攔截,執行期監控等功能

5.容器提供了眾多的輔助類,能加快應用的開發

6.spring對於主流的應用框架提供了整合支援,如hibernate,jpa,struts等

7.spring屬於低侵入式設計,**的汙染極低

8.獨立於各種應用伺服器

9.spring的di機制降低了業務物件替換的複雜性

10.spring的高度開放性,並不強制應用完全依賴於spring,開發者可以自由選擇spring的部分或全部

ioc,即控制反轉(inversion of control),他與依賴注入(dependecy injection)是同乙個概念。具體的講:當某個角色需要另外乙個角色協助的時候,在傳統的程式設計過程中,通常由呼叫者來建立被呼叫者的例項。但在spring中 建立被呼叫者的工作不再由呼叫者來完成,因此稱為控制反轉。建立被呼叫者的工作由spring來完成,然後注入呼叫者因此也稱為依賴注入。

它並不是一種技術實現,而是一種設計思想。在任何乙個有實際開發意義的程式專案中,我們會使用很多類來描述它們特有的功能,並且通過類與類之間的相互協作來完成特定的業務邏輯。這個時候,每個類都需要負責管理與自己有互動的類的引用和依賴,**將會變的異常難以維護和極度的高耦合。而ioc的出現正是用來解決這個問題,我們通過ioc將這些相互依賴物件的建立、協調工作交給spring容器去處理,每個物件只需要關注其自身的業務邏輯關係就可以了。在這樣的角度上來看,獲得依賴的物件的方式,進行了反轉,變成了由spring容器控制物件如何獲取外部資源(包括其他物件和檔案資料等等)。

舉例:某一天,你生病了,但是你不清楚自己到底得了什麼病,你只知道自己頭疼,咳嗽,全身無力。這個時候你決定去藥店買藥,藥店有很多種藥,僅僅是**頭疼就有好幾十種,還有西藥中藥等區別。然後你自己看了看說明書,選擇了一盒你自己覺得最能**自己病症的藥,付錢吃藥,期待可以早點好起來。 但是這個過程,對於乙個病人來說,太辛苦了。頭疼,咳嗽,全身無力,還要乙個個的看藥品說明書,乙個個的比較哪個藥比較好,簡直是太累了。這個時候,你決定直接去醫院看醫生。 醫生給你做了檢查,知道你的病症是什麼,有什麼原因引起的;同時醫生非常了解有哪些藥能**你的病痛,並且能根據你的自身情況進行篩選。只需要短短的十幾分鐘,你就能拿到對症下藥的藥品,即省時又省力。

在上面這個例子中,ioc起到的就是醫生的作用,它收集你的需求要求,並且對症下藥,直接把藥開給你。你就是物件,藥品就是你所需要的外部資源。通過醫生,你不用再去找藥品,而是通過醫生把藥品開給你。這就是整個ioc的精髓所在。

spring以動態靈活的方式來管理物件 , 注入的兩種方式,設定注入和構造注入。

設定注入的優點:直觀,自然

構造注入的優點:可以在構造器中決定依賴關係的順序。

aop:面向切面程式設計,往往被定義為促使軟體系統實現關注點的分離的技術。系統是由許多不同的元件所組成的,每乙個元件各負責一塊特定功能。除了實現自身核心功能之外,這些元件還經常承擔著額外的職責。例如日誌、事務管理和安全這樣的核心服務經常融入到自身具有核心業務邏輯的元件中去。這些系統服務經常被稱為橫切關注點,因為它們會跨越系統的多個元件。

aop的概念不像ioc一樣例項化舉例,現在我們以乙個系統中的具體實現來講講aop具體是個什麼技術。

我們以系統中常用到的事務管控舉例子。在系統運算元據庫的過程中,不可避免地要考慮到事務相關的內容。如果在每乙個方法中都新建乙個事務管理器,那麼無疑是對**嚴重的耦合和侵入。為了簡化我們的開發過程(實際上spring所做的一切實現都是為了簡化開發過程),需要把事務相關的**抽成出來做為乙個獨立的模組。通過aop,確認每乙個運算元據庫方法為乙個連線點,這些連線點組成了乙個切面。當程式執行到其中某個乙個切點時,我們將事務管理模組順勢織入物件中,通過通知功能,完成整個事務管控的實現。這樣一來,所有的運算元據庫的方法中不需要再單獨關心事務管理的內容,只需要關注自身的業務**的實現即可。所有的事務管控相關的內容都通過aop的方式進行了實現。簡化了**的內容,將目標物件複雜的內容進行解耦,分離業務邏輯與橫切關注點。

1、通知: 通知定義了切面是什麼以及何時使用的概念。spring 切面可以應用5種型別的通知:

2、連線點:是在應用執行過程中能夠插入切面的乙個點。

3、切點: 切點定義了切面在何處要織入的乙個或者多個連線點。

4、切面:是通知和切點的結合。通知和切點共同定義了切面的全部內容。

5、引入:引入允許我們向現有類新增新方法或屬性。

6、織入:是把切面應用到目標物件,並建立新的**物件的過程。切面在指定的連線點被織入到目標物件中。在目標物件的生命週期中有多個點可以進行織入:

面向切面程式設計(aop)完善spring的依賴注入(di),面向切面程式設計在spring中主要表現為兩個方面:

面向切面程式設計提供宣告式事務管理

spring支援使用者自定義的切面

面向切面程式設計(aop)是對物件導向程式設計(oop)的補充, 物件導向程式設計將程式分解成各個層次的物件,面向切面程式設計將程式執行過程分解成各個切面。

aop從程式執行角度考慮程式的結構,提取業務處理過程的切面,oop是靜態的抽象,aop是動態的抽象, 是對應用執行過程中的步驟進行抽象,,從而獲得步驟之間的邏輯劃分。

aop框架具有的兩個特徵:

各個步驟之間的良好隔離性

源**無關性

ioc:控制反轉也叫依賴注入,ioc利用j**a反射機制,aop利用**模式。所謂控制反轉是指,本來被呼叫者的例項是有呼叫者來建立的,這樣的缺點是耦合性太強,ioc則是統一交給spring來管理建立,將物件交給容器管理,你只需要在spring配置檔案總配置相應的bean,以及設定相關的屬性,讓spring容器來生成類的例項物件以及管理物件。在spring容器啟動的時候,spring會把你在配置檔案中配置的bean都初始化好,然後在你需要呼叫的時候,就把它已經初始化好的那些bean分配給你需要呼叫這些bean的類。

aop:面向切面程式設計。(aspect-oriented programming)

aop可以說是對oop的補充和完善。oop引入封裝、繼承和多型性等概念來建立一種物件層次結構,用以模擬公共行為的乙個集合。實現aop的技術,主要分為兩大類:一是採用動態**技術,利用擷取訊息的方式,對該訊息進行裝飾,以取代原有物件行為的執行;二是採用靜態織入的方式,引入特定的語法建立「方面」,從而使得編譯器可以在編譯期間織入有關「方面」的**,屬於靜態**。

深入理解spring事務

事務介紹 乙個事務要麼同時成功,要麼同時失敗 特性事務隔離級別 傳播行為 唯讀事務只進行讀取操作 readonly true 告訴spring當前事務只會進行讀取操作,不會進行修改操作,可以幫助資料庫引擎優化 注 如果設定為唯讀的話,千萬不要在事務裡修改資料,使用唯讀操作時,spring不會進行加鎖...

深入認識Spring兩大特性IOC和AOP

眾所周知,spring有兩大特性 ioc和aop。ioc 英文全稱是inversion of control,意為控制反轉 依賴注入。aop 英文全稱是aspect oriented programming,意為面向切面程式設計。總的來說,spring是乙個輕量級的控制反轉 ioc 和面向切面程式設...

深入理解物件導向的三大基本特徵

我們都知道物件導向有三個基本特徵 封裝,多型和繼承。封裝 我先來援引一 位寫的段子 基本的變數已經不再浮游於一大段一大段的程式中了,它們已經放棄了 其實是程式設計師不用這種方式了 這種自由自在的存在方式,而是安穩的寄 居於龐大而蹣跚的 物件 內部,與外界隔開來,通過迂迴曲折的間接途徑與外部世界聯絡和...