Spring的DI\IOC\AOP詳解

Spring 框架是 Java 應用最廣的框架,它的成功來源於理念,而不是技術本身,它的理念包括IOC (InversionOfControl,控制反轉)、DI(DependiceInjection,依賴注入) 和 AOP(Aspect Oriented Programming,面向切面編程)。

是什麼?Spring是一個輕量級DI/IOC/AOP開源框架

哪裏用?我覺得它可以適用於任何Java開發的程序

用之後?最直觀的體現,簡化Java代碼開發

獨自旅行 分割線

IOC(Inverse Of Controller,意爲控制反轉)

控制反轉,實現理論爲藉助於“第三方”實現具有依賴關係的對象之間的解耦:即把各個對象類封裝之後,通過IOC容器來關聯這些對象類,這樣對象和對象之間就通過IOC容器進行聯繫,但對象與對象之間並沒有什麼直接聯繫。

爲什麼叫控制反轉呢?

舉例說我們沒有使用spring框架的時候,假設有兩個對象,對象A依賴對象B,那麼A對象在實例化或者運行到某一個點的時候,我們就需要主動創建對象B或者使用已經創建好的對象B,控制權在我們自己手裏。

但是如果我們使用Spring的IOC容器,對象A和對象B在IOC容器中就失去了直接聯繫,當對象A實例化和運行時,如果需要對象B的話,IOC容器會主動創建一個對象B注入到對象A所需要的地方。這樣我們就將對象A依賴於對象B的過程由主動行爲變成了被動行爲,就是把創建對象的權力交給了IOC容器進行管理,控制權裝換到了Spring的IOC手中,這就是IOC,控制反轉;

對於IOC控制反轉,不光是Spring的IOC容器,我認爲大部分的框架都應用到了控制反轉的思想,控制反轉不僅僅是創建對象的控制權,更是對執行流程的控制反轉,例如我們寫一個簡單的MVC應用,那麼我們需要具體的Controller和view,我們還需要自行控制請求的監聽與接受、Controller的值以及view最後的展示的整個流程,這時候這個流程控制在我們自己手中,但是舉例我們使用SpringMVC框架,使用SpringMVC之後,我們前面所提的這些流程大部分就交給了Spring來進行管理;

獨自旅行 分割線

DI(Dependice Injection,依賴注入)

依賴注入:這是一種對象提供性的設計模式,如果說IOC是進行控制的,那麼DI就是實現這個過程控制的方式,在介紹IOC的時候我們提到要把對象交給Spring的IOC容器進行管理,那麼如何讓Spring知道對象A和對象B之間的關係呢,這個關係可以稱爲依賴,將這個依賴通過例如XML配置文件的方式告訴框架,這就叫做依賴注入;

對於DI(依賴注入),其實也可以把它理解爲一種IOC模式,我們把類與類之間的關係告訴給Spring的IOC容器,這就是把依賴告訴給框架,由框架管理,就是獲得依賴對象的方式反轉了;

獨自旅行 分割線

AOP(Aspect Oriented Programming,面向切面編程)

面向切面編程,將日誌、事務等相對獨立且重複的功能進行抽取,利用spring的AOP將這些功能進行織入,提高代碼的複用性;

在面向切面編程的思想裏面,把功能分爲核心業務功能,和周邊功能。

核心業務,比如登陸,增加數據,刪除數據都叫核心業務等等
周邊功能,比如性能統計記錄,日誌,事務管理等等
面向切面編程AOP的思想裏面,核心業務功能和切面功能分別獨立進行開發,然後把切面功能和核心業務功能 “編織” 在一起,這就叫AOP面向切面編程

AOP能夠將那些與業務無關,卻爲業務模塊所共同調用的邏輯或責任(例如事務處理、日誌管理、權限控制等)封裝起來,便於減少系統的重複代碼,降低模塊間的耦合度,並有利於未來的可拓展性和可維護性。

Spring AOP的原理是動態代理,動態代理意爲在運行期間對業務方法進行增強,所以不會生成新類,對於動態代理技術,Spring AOP提供了對JDK動態代理的支持以及CgLib的支持。前者是基於反射技術的實現,後者是基於繼承的機制實現。如果目標對象有實現接口,使用jdk代理。如果目標對象沒有實現接口,則使用CgLib來進行代理操作;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章