前華南谷歌架構師講的SpringIOC和AOP就是不同,這回我是真的理解了

我們是在使用Spring框架的過程中,其實就是爲了使用IOC(Inversion of Control)和AOP(Aspect-Oriented Programming),這兩個是Spring的核心。

Spring是什麼

Spring框架是一個開放源代碼的J2EE應用程序框架,是一個開放源代碼的設計層面框架,它解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向接口的編程思想貫穿整個系統應用。Spring是一個開源容器框架,它集成各類型的工具,通過核心的Bean factory實現了底層的類的實例化和生命週期的管理。在整個框架中,各類型的功能被抽象成一個個的 Bean,這樣就可以實現各種功能的管理,包括動態加載和切面編程。

Spring核心模塊

Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。

模塊構建在覈心容器之上,核心容器定義了創建、配置和管理 bean 的方式,如圖所示:

組成Spring框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。

每個模塊的功能如下:

1、核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。

核心容器的主要組件是 BeanFactory,它是工廠模式的實現。

BeanFactory 使用控制反轉(IOC) 模式將應用程序的配置和依賴性規範與實際的應用程序代碼分開 。

2、Spring 上下文:Spring 上下文是一個配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企業服務,例如JNDI、EJB、電子郵件、國際化、校驗和調度功能。

3、Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向切面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持AOP。Spring AOP 模塊爲基於 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。

4、Spring DAO:JDBCDAO抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。

5、Spring ORM:負責框架中對象關係映射,提供相關ORM 接入框架的關係對象管理工具 。Spring 框架插入了若干個ORM框架,從而提供了 ORM 的對象關係工具,其中包括JDO、Hibernate和iBatisSQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。

6、Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,爲基於 Web 的應用程序提供了上下文。所以,Spring框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。

7、Spring MVC 框架:MVC框架是一個全功能的構建 Web應用程序的 MVC 實現。通過策略接口,MVC框架變成爲高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。模型由javabean構成,存放於Map;視圖是一個接口,負責顯示模型;控制器表示邏輯代碼,是Controller的實現。Spring框架的功能可以用在任何J2EE服務器中,大多數功能也適用於不受管理的環境。

Spring的優點

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

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

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

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

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

6.spring對於主流的應用框架提供了集成支持,如hibernate,JPA,Struts等

7.spring屬於低侵入式設計,代碼的污染極低

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

9.spring的DI機制降低了業務對象替換的複雜性

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

IOC和AOP

IOC:即控制反轉(Inversion of Control)它並不是一種技術實現,而是一種設計思想。IOC的目的是爲了如何指導我們編寫出更加鬆耦合,更加優雅的程序。傳統的應用程序使我們在類的內部顯式的創建依賴的對象。從而導致類與類之間耦合度過高。而使用了IOC的設計思想,將對象的創建,查找依賴,以及生命週期的控制權交給了IOC容器。對象之間耦合較鬆,更加靈活。

在任何一個有實際開發意義的程序項目中,我們會使用很多類來描述它們特有的功能,並且通過類與類之間的相互協作來完成特定的業務邏輯。這個時候,每個類都需要負責管理與自己有交互的類的引用和依賴,代碼將會變的異常難以維護和極度的高耦合。

而IOC的出現正是用來解決這個問題,我們通過IOC將這些相互依賴對象的創建、協調工作交給Spring容器去處理,每個對象只需要關注其自身的業務邏輯關係就可以了。

傳統應用中是由我們自己在對象中主動控制去直接獲取依賴對象。反轉則是通過容器來進行對象的依賴和創建,這裏,對象只是被動的接收依賴對象,因此稱爲反轉,而反轉的則是依賴對象的獲取被反轉了。

傳統的Java設計中,直接會在對象的內部通過new進行對象的創建,使程序主動創建依賴對象。對IOC來說,有一個專門的容器專門管理這些對象的生命週期,控制對象的創建。所以在Ioc中,是通過Ioc容器控制對象,由Ioc容器控制外部資源的獲取。

在這樣的角度上來看,獲得依賴的對象的方式,進行了反轉,變成了由spring容器控制對象如何獲取外部資源。

AOP:面向切面編程,往往被定義爲促使軟件系統實現關注點的分離的技術。系統是由許多不同的組件所組成的,每一個組件各負責一塊特定功能。除了實現自身核心功能之外,這些組件還經常承擔着額外的職責。

例如日誌、事務管理和安全這樣的核心服務經常融入到自身具有核心業務邏輯的組件中去。這些系統服務經常被稱爲橫切關注點,因爲它們會跨越系統的多個組件。

AOP可以說是對OOP的補充和完善。

OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行爲的一個集合。

當我們需要爲分散的對象引入公共行爲的時候,OOP則顯得無能爲力。

也就是說,OOP允許你定義從上到下的關係,但並不適合定義從左到右的關係。

例如日誌功能。

日誌代碼往往水平地散佈在所有對象層次中,而與它所散佈到的對象的核心功能毫無關係。

在OOP設計中,它導致了大量代碼的重複,而不利於各個模塊的重用。

將程序中的交叉業務邏輯(比如安全,日誌,事務等),封裝成一個切面,然後注入到目標對象(具體業務邏輯)中去。

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