您好,登錄后才能下訂單哦!
Spring中IOC和AOP的區(qū)別是什么,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Spring 簡介
Spring 是一個開源的輕量級的企業(yè)級框架,其核心是反轉(zhuǎn)控制 (IoC) 和面向切面 (AOP) 的容器框架。我們可以把 Spring 看成是對象的容器,容器中可以包含很多對象,所以 Spring 有很多強大的功能。
一句話,Spring 是項目中對象的管家,負責管理項目中用到的所有對象。所以在項目三層架構(gòu)中,Spring 不屬于某一特定層。
Spring 的 Hello World
想要構(gòu)建一個 Spring 的入門程序,我們需要導(dǎo)入 4 個核心包和 2 個輔助包,創(chuàng)建一個實體類,最主要的是編寫核心配置文件,applicationContext.xml 放在 src 下。最后寫一個測試類即可。此時在測試類中我們不需要在使用 new 關(guān)鍵字去創(chuàng)建對象了。這也正是 Spring 的作用所在,會自動給我創(chuàng)建對象。
上圖展示的就是最基本的演示,也是很容易就理解了,配置文件中配置了 user 對象,我們通過加載配置文件來獲取對象從而避免了使用 new 來創(chuàng)建。
什么是 IOC
到這里我們就可以解釋一下 Spring 中的核心概念之一的 IOC,即 inverse of control ,翻譯過來就是反轉(zhuǎn)控制。想想我們以前想要一個對象就會主動的 new ?,F(xiàn)在 Spring 會幫我們創(chuàng)建對象,不需要手工 new(但是要記得配置呀)反轉(zhuǎn)說的就是創(chuàng)建對象的方式反轉(zhuǎn)了,以前是我們自己創(chuàng)建對象,現(xiàn)在由 Spring 為我們創(chuàng)建。
控制又是指什么呢?一個對象要有屬性值吧,還有可能存在其它的對象,控制說的就是這些屬性和引用不需要自己寫了,由 Spring 來為我們自動創(chuàng)建(其實還是我們自己配置的~)。
總結(jié)下來就是 Spring 可以自動的為我們創(chuàng)建對象,并注入依賴。而反轉(zhuǎn)控制說的就是以前我們自己創(chuàng)建對象和依賴,現(xiàn)在由程序為我們創(chuàng)建。
Spring 創(chuàng)建對象的方式
那 Spring 又是如何為我們創(chuàng)建的呢?我們知道對象的創(chuàng)建必須要經(jīng)過構(gòu)造器,從上面的例子中看到,我們只配置了一個<bean>標簽,其實這就是將空參構(gòu)造器使用配置文件給表示出來罷了。Spring 中創(chuàng)建對象也就是這么簡單,當然配置可以更復(fù)雜些,后面再說,但目前我們可以知道,Spring 創(chuàng)建對象的就是通過配置 bean 標簽,調(diào)用構(gòu)造器來實現(xiàn)的。如何調(diào)用構(gòu)造器的,那肯定是反射搞的鬼。
藏在 IOC 背后的 DI
DI,Dependency Injection,即依賴注入。IOC 還體現(xiàn)在自動注入依賴,依賴注入這詞聽起來不太明白,簡單的理解為綁定數(shù)據(jù),這是一種具體的技術(shù),IOC 是思想,DI 是技術(shù)實現(xiàn)。對象之中需要其它的對象,類如 Service 層中需要 DAO 層對象,我們不需要在 Service 中手動 new 了,只需要配置一下即可。
常用的注入方式有兩種,set 方法注入和構(gòu)造方法注入。而每一種注入方式中又有注入基本數(shù)據(jù)類型和引用數(shù)據(jù)類型之分。下面就看看如何配置。
set 方法注入
通過 property 標簽來配置屬性,基本數(shù)據(jù)類型使用 value 屬性即可,若是引用類型則使用 ref 。注意,User 對象中要有 Car 引用并且提供其 set 方法。
構(gòu)造方法注入
這個配置看一眼就基本理解了,非常簡單,說個小細節(jié),對象的創(chuàng)建需要執(zhí)行構(gòu)造器,我們在初始化對象的時候會使用反射通過全類名得到對象,而這時就需要一個空參的構(gòu)造器,我們不提供構(gòu)造器的情況下,程序會自動為我們提供一個空參構(gòu)造器,但是一旦重寫構(gòu)造器,我們就需要提供空參構(gòu)造器,不然就報錯。
雖然還有其它屬性注入的方式,比方說 p 名稱空間注入,spel 注入,但是這些都不重要!最常用的就一個那就是 set 方法注入。抓住重點,簡單省時。
總結(jié)一下,以上主要說了什么是 Spring,如何搭建入門項目,解釋了 IOC 思想,以及站在 IOC 背后的技術(shù) DI,我們使用 set 方式注入基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,當然,這些東西都構(gòu)建在反射之上。
AOP 介紹
AOP 是我們經(jīng)常聽到的概念,然而聽的太多我們卻忘記了最初的定義,全稱 Aspect Oriented Programming 翻譯過來就是面向切面編程。首先,要搞清楚這是一種思想,Spring 的核心思想就有 AOP 。
嘗試理解一下 AOP 的思想,簡單來說就是“縱向重復(fù),橫向抽取”這很抽象,舉幾個例子,F(xiàn)ilter 的思想,過濾器在解決亂碼的時候不需要我們在每一個類中都寫處理亂碼的代碼。而是直接由 Fliter 來統(tǒng)一處理。還有攔截器的思想,我們在 Action 中需要對參數(shù)進行校驗、封裝,而攔截器又是統(tǒng)一對參數(shù)進行校驗、封裝。
不管是 Fliter 還是攔截器,都是面向切面編程思想的具體應(yīng)用。而我們今天說的 Spring 中的 AOP 又是如何體現(xiàn)呢?
動態(tài)代理和 cglib 代理
那就是通過代理,Spring 中通過代理達到統(tǒng)一增強代理對象的目的,而不需要對類中的方法一個一個增強。我們以前接觸過動態(tài)代理,知道在動態(tài)代理中我們的代理對象和被代理對象需要實現(xiàn)同一個接口,在 Spring 中無法保證每個需要增強的類都實現(xiàn)接口,所以就需要引用另外一種代理技術(shù) cglib 代理。
總結(jié)一下就是 Spring 中通過代理來體現(xiàn) AOP 的思想,而代理的實現(xiàn)又分為動態(tài)代理和 cglib 代理。動態(tài)代理要求代理類和被代理類實現(xiàn)同一個接口。而 cglib 是繼承代理,代理對象只需繼承被代理對象即可實現(xiàn)。在 Spring 中優(yōu)先使用動態(tài)代理。
兩種代理方式有不同的測試代碼,這里我不再展示,當我敲代碼的時候我突然想到來上海第一次面試的時候,面試官就讓我實現(xiàn)一下 Spring 中的 AOP,現(xiàn)在終于想通了,就是讓我寫一下兩種代理方法的實現(xiàn)呀。可惜,當時一臉懵逼……
Spring 中與 AOP 相關(guān)名詞
連接點(joinPoint): 在目標對象中,所有可以增強的方法。
切入點(pointCut): 在目標對象中,已經(jīng)增強的方法。
增強/通知(advice): 增強的代碼。
目標對象(target): 被代理對象。
織入(weaving): 將通知應(yīng)用到到連接點。
代理(Proxy): 將通知織入到目標對象形成代理對象。
切面(aspect): 切入點+通知。
下面通過代碼展示一下 Spring 中 AOP 的展示,順帶看看與這幾個名詞的對象關(guān)系。
上面的整個過程就是 Spring 中 AOP 的體現(xiàn),將通知織入到目標對象中形成代理的這么一個過程。我們?yōu)榱诉@個需要準備目標對象,通知對象,還要學(xué)會如何配置切點和切面。
上面只是為了測試一下能否正確的生成代理對象,而在 Spring 中真正應(yīng)用 AOP 的是對事務(wù)的處理。Spring AOP 實質(zhì)就是幫我們生成代理對象,而這個代理對象包含了對事務(wù)的處理。我們通過配置即可生成代理對象,而不需要我們再手敲代碼處理事務(wù)。
在 Spring 中還提供了使用注解來配置,注釋的出現(xiàn)就是為了替換配置文件,然而注釋使用的不多。
總結(jié)一下,IoC 和 AOP 都是 Spring 中的核心概念,IoC 體現(xiàn)在 Spring 會為我們自動創(chuàng)建對象,由以前的手動 new 對象,到現(xiàn)在 Spring 統(tǒng)一管理。
我想到一個例子來說明一下 AOP,高速路上的收費站就是一個切面,Spring 的 IoC 就是一個發(fā)車站,負責維護汽車對象和依賴對象汽車上的人,車就是目標對象,而我們要生成的代理對象就是通過收費站的汽車。
關(guān)于Spring中IOC和AOP的區(qū)別是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。