Spring中IOC和AOP的深入講解

這篇文章主要給大家介紹了關於Spring中IOC和AOP的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨着小編來一起學習學習吧

前言

Spring是一個開源框架,Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是爲了解決企業應用開發的複雜性而創建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。 簡單來說,Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架。

這篇文章主要講 Spring 中的幾個點,Spring 中的 IOC,AOP,下一篇說說 Spring 中的事務操作,註解和 XML 配置。

Spring 簡介

Spring 是一個開源的輕量級的企業級框架,其核心是反轉控制 (IoC) 和麪向切面 (AOP) 的容器框架。我們可以把 Spring 看成是對象的容器,容器中可以包含很多對象,所以 Spring 有很多強大的功能。

一句話,Spring 是項目中對象的管家,負責管理項目中用到的所有對象。所以在項目三層架構中,Spring 不屬於某一特定層。

Spring 的 Hello World

想要構建一個 Spring 的入門程序,我們需要導入 4 個核心包和 2 個輔助包,創建一個實體類,最主要的是編寫核心配置文件,applicationContext.xml 放在 src 下。最後寫一個測試類即可。此時在測試類中我們不需要在使用 new 關鍵字去創建對象了。這也正是 Spring 的作用所在,會自動給我創建對象。

上圖展示的就是最基本的演示,也是很容易就理解了,配置文件中配置了 user 對象,我們通過加載配置文件來獲取對象從而避免了使用 new 來創建。

什麼是 IOC

到這裏我們就可以解釋一下 Spring 中的核心概念之一的 IOC,即 inverse of control ,翻譯過來就是反轉控制。想想我們以前想要一個對象就會主動的 new 。現在 Spring 會幫我們創建對象,不需要手工 new(但是要記得配置呀)反轉說的就是創建對象的方式反轉了,以前是我們自己創建對象,現在由 Spring 爲我們創建。

控制又是指什麼呢?一個對象要有屬性值吧,還有可能存在其它的對象,控制說的就是這些屬性和引用不需要自己寫了,由 Spring 來爲我們自動創建(其實還是我們自己配置的~)。

總結下來就是 Spring 可以自動的爲我們創建對象,並注入依賴。而反轉控制說的就是以前我們自己創建對象和依賴,現在由程序爲我們創建。

Spring 創建對象的方式

那 Spring 又是如何爲我們創建的呢?我們知道對象的創建必須要經過構造器,從上面的例子中看到,我們只配置了一個<bean>標籤,其實這就是將空參構造器使用配置文件給表示出來罷了。Spring 中創建對象也就是這麼簡單,當然配置可以更復雜些,後面再說,但目前我們可以知道,Spring 創建對象的就是通過配置 bean 標籤,調用構造器來實現的。如何調用構造器的,那肯定是反射搞的鬼。

藏在 IOC 背後的 DI

DI,Dependency Injection,即依賴注入。IOC 還體現在自動注入依賴,依賴注入這詞聽起來不太明白,簡單的理解爲綁定數據,這是一種具體的技術,IOC 是思想,DI 是技術實現。對象之中需要其它的對象,類如 Service 層中需要 DAO 層對象,我們不需要在 Service 中手動 new 了,只需要配置一下即可。

常用的注入方式有兩種,set 方法注入和構造方法注入。而每一種注入方式中又有注入基本數據類型和引用數據類型之分。下面就看看如何配置。

set 方法注入

通過 property 標籤來配置屬性,基本數據類型使用 value 屬性即可,若是引用類型則使用 ref 。注意,User 對象中要有 Car 引用並且提供其 set 方法。

構造方法注入

這個配置看一眼就基本理解了,非常簡單,說個小細節,對象的創建需要執行構造器,我們在初始化對象的時候會使用反射通過全類名得到對象,而這時就需要一個空參的構造器,我們不提供構造器的情況下,程序會自動爲我們提供一個空參構造器,但是一旦重寫構造器,我們就需要提供空參構造器,不然就報錯。

雖然還有其它屬性注入的方式,比方說 p 名稱空間注入,spel 注入,但是這些都不重要!最常用的就一個那就是 set 方法注入。抓住重點,簡單省時。

總結一下,以上主要說了什麼是 Spring,如何搭建入門項目,解釋了 IOC 思想,以及站在 IOC 背後的技術 DI,我們使用 set 方式注入基本數據類型和引用數據類型,當然,這些東西都構建在反射之上。

AOP 介紹

AOP 是我們經常聽到的概念,然而聽的太多我們卻忘記了最初的定義,全稱 Aspect Oriented Programming 翻譯過來就是面向切面編程。首先,要搞清楚這是一種思想,Spring 的核心思想就有 AOP 。

嘗試理解一下 AOP 的思想,簡單來說就是“縱向重複,橫向抽取”這很抽象,舉幾個例子,Filter 的思想,過濾器在解決亂碼的時候不需要我們在每一個類中都寫處理亂碼的代碼。而是直接由 Fliter 來統一處理。還有攔截器的思想,我們在 Action 中需要對參數進行校驗、封裝,而攔截器又是統一對參數進行校驗、封裝。

不管是 Fliter 還是攔截器,都是面向切面編程思想的具體應用。而我們今天說的 Spring 中的 AOP 又是如何體現呢?

動態代理和 cglib 代理

那就是通過代理,Spring 中通過代理達到統一增強代理對象的目的,而不需要對類中的方法一個一個增強。我們以前接觸過動態代理,知道在動態代理中我們的代理對象和被代理對象需要實現同一個接口,在 Spring 中無法保證每個需要增強的類都實現接口,所以就需要引用另外一種代理技術 cglib 代理。

總結一下就是 Spring 中通過代理來體現 AOP 的思想,而代理的實現又分爲動態代理和 cglib 代理。動態代理要求代理類和被代理類實現同一個接口。而 cglib 是繼承代理,代理對象只需繼承被代理對象即可實現。在 Spring 中優先使用動態代理。

兩種代理方式有不同的測試代碼,這裏我不再展示,當我敲代碼的時候我突然想到來上海第一次面試的時候,面試官就讓我實現一下 Spring 中的 AOP,現在終於想通了,就是讓我寫一下兩種代理方法的實現呀。可惜,當時一臉懵逼……

Spring 中與 AOP 相關名詞

連接點(joinPoint): 在目標對象中,所有可以增強的方法。

切入點(pointCut): 在目標對象中,已經增強的方法。

增強/通知(advice): 增強的代碼。

目標對象(target): 被代理對象。

織入(weaving): 將通知應用到到連接點。

代理(Proxy): 將通知織入到目標對象形成代理對象。

切面(aspect): 切入點+通知。

下面通過代碼展示一下 Spring 中 AOP 的展示,順帶看看與這幾個名詞的對象關係。

上面的整個過程就是 Spring 中 AOP 的體現,將通知織入到目標對象中形成代理的這麼一個過程。我們爲了這個需要準備目標對象,通知對象,還要學會如何配置切點和切面。

上面只是爲了測試一下能否正確的生成代理對象,而在 Spring 中真正應用 AOP 的是對事務的處理。Spring AOP 實質就是幫我們生成代理對象,而這個代理對象包含了對事務的處理。我們通過配置即可生成代理對象,而不需要我們再手敲代碼處理事務。

在 Spring 中還提供了使用註解來配置,註釋的出現就是爲了替換配置文件,然而註釋使用的不多。

總結一下,IoC 和 AOP 都是 Spring 中的核心概念,IoC 體現在 Spring 會爲我們自動創建對象,由以前的手動 new 對象,到現在 Spring 統一管理。

我想到一個例子來說明一下 AOP,高速路上的收費站就是一個切面,Spring 的 IoC 就是一個發車站,負責維護汽車對象和依賴對象汽車上的人,車就是目標對象,而我們要生成的代理對象就是通過收費站的汽車。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對神馬文庫的支持。

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