首先聲明:IoC & AOP 不是 Spring 提出來的,它們在 Spring 之前其實已經存在了,只不過當時更加偏向于理論。Spring 在技術層次將這兩個思想進行了很好的實現。
什么是 IoC
IoC (Inversion of control )控制反轉/反轉控制。它是一種思想不是一個技術實現。描述的是:Java 開發領域對象的創建以及管理的問題。
例如:現有類 A 依賴于類 B
傳統的開發方式:往往是在類 A 中手動通過 new 關鍵字來 new 一個 B 的對象出來
使用 IoC 思想的開發方式:不通過 new 關鍵字來創建對象,而是通過 IoC 容器(Spring 框架) 來幫助我們實例化對象。我們需要哪個對象,直接從 IoC 容器里面過去即可。
從以上兩種開發方式的對比來看:我們 “喪失了一個權力” (創建、管理對象的權力),從而也得到了一個好處(不用再考慮對象的創建、管理等一系列的事情)
控制:指的是對象創建(實例化、管理)的權力
反轉:控制權交給外部環境(Spring 框架、IoC 容器)
IoC 解決了什么問題
IoC 的思想就是兩方之間不互相依賴,由第三方容器來管理相關資源。這樣有什么好處呢?
對象之間的耦合度或者說依賴程度降低;
資源變的容易管理;比如你用 Spring 容器提供的話很容易就可以實現一個單例。
例如:現有一個針對 User 的操作,利用 Service 和 Dao 兩層結構進行開發
在沒有使用 IoC 思想的情況下,Service 層想要使用 Dao 層的具體實現的話,需要通過 new 關鍵字在UserServiceImpl 中手動 new 出 IUserDao 的具體實現類 UserDaoImpl(不能直接 new 接口類)。
很完美,這種方式也是可以實現的,但是我們想象一下如下場景:
開發過程中突然接到一個新的需求,針對對IUserDao 接口開發出另一個具體實現類。因為 Server 層依賴了IUserDao的具體實現,所以我們需要修改UserServiceImpl中 new 的對象。如果只有一個類引用了IUserDao的具體實現,可能覺得還好,修改起來也不是很費力氣,但是如果有許許多多的地方都引用了IUserDao的具體實現的話,一旦需要更換IUserDao 的實現方式,那修改起來將會非常的頭疼。
使用 IoC 的思想,我們將對象的控制權(創建、管理)交有 IoC 容器去管理,我們在使用的時候直接向 IoC 容器 “要” 就可以了
IoC 和 DI 別再傻傻分不清楚
IoC(Inverse of Control:控制反轉)是一種設計思想或者說是某種模式。這個設計思想就是將原本在程序中手動創建對象的控制權,交由 Spring 框架來管理。IoC 在其他語言中也有應用,并非 Spring 特有。IoC 容器是 Spring 用來實現 IoC 的載體, IoC 容器實際上就是個 Map(key,value),Map 中存放的是各種對象。
IoC 最常見以及最合理的實現方式叫做依賴注入(Dependency Injection,簡稱 DI)。
意思是 IoC 太普遍并且不表意,很多人會因此而迷惑,所以,使用 DI 來精確指名這個模式比較好。
什么是 AOP
AOP:Aspect oriented programming 面向切面編程,AOP 是 OOP(面向對象編程)的一種延續。
下面我們先看一個 OOP 的例子。
例如:現有三個類,Horse、Pig、Dog,這三個類中都有 eat 和 run 兩個方法。
通過 OOP 思想中的繼承,我們可以提取出一個 Animal 的父類,然后將 eat 和 run 方法放入父類中,Horse、Pig、Dog通過繼承Animal類即可自動獲得 eat() 和 run() 方法。這樣將會少些很多重復的代碼。
OOP 編程思想可以解決大部分的代碼重復問題。但是有一些問題是處理不了的。比如在父類 Animal 中的多個方法的相同位置出現了重復的代碼,OOP 就解決不了。
/**
* 動物父類
*/
public class Animal {
/** 身高 */
private String height;
/** 體重 */
private double weight;
public void eat() {
// 性能監控代碼
long start = System.currentTimeMillis();
// 業務邏輯代碼
System.out.println("I can eat...");
// 性能監控代碼
System.out.println("執行時長:" + (System.currentTimeMillis() - start)/1000f + "s");
}
public void run() {
// 性能監控代碼
long start = System.currentTimeMillis();
// 業務邏輯代碼
System.out.println("I can run...");
// 性能監控代碼
System.out.println("執行時長:" + (System.currentTimeMillis() - start)/1000f + "s");
}
}
這部分重復的代碼,一般統稱為橫切邏輯代碼。
橫切邏輯代碼存在的問題:
代碼重復問題
橫切邏輯代碼和業務代碼混雜在一起,代碼臃腫,不便維護
AOP 就是用來解決這些問題的
AOP 另辟蹊徑,提出橫向抽取機制,將橫切邏輯代碼和業務邏輯代碼分離
代碼拆分比較容易,難的是如何在不改變原有業務邏輯的情況下,悄無聲息的將橫向邏輯代碼應用到原有的業務邏輯中,達到和原來一樣的效果。
AOP 解決了什么問題
通過上面的分析可以發現,AOP 主要用來解決:在不改變原有業務邏輯的情況下,增強橫切邏輯代碼,根本上解耦合,避免橫切邏輯代碼重復。
AOP 為什么叫面向切面編程
切:指的是橫切邏輯,原有業務邏輯代碼不動,只能操作橫切邏輯代碼,所以面向橫切邏輯
面:橫切邏輯代碼往往要影響的是很多個方法,每個方法如同一個點,多個點構成一個面。
感謝各位的閱讀,以上就是“IoC和AOP是什么”的內容了,經過本文的學習后,相信大家對IoC和AOP是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是本站,小編將為大家推送更多相關知識點的文章,歡迎關注!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
石油工業七姐妹是什么意思?石油七姐妹是哪幾家?石油工業七姐妹的秘密是什么?一起隨小編簡單了解下!石油工業七姐妹是西方石油行業的一個常用詞,指的是洛克菲勒標準石油公司解散后的三大石油公司和其他四大具有國際影響力的公司。石油工業的發展史是一部產業演變和人類社會發展的史詩。從標準石油獨霸世界到被美國最高法院以“反壟斷”的名義肢解;從1920年石油巨頭在費布斯城堡的秘密會面,到七姐...
(資料圖)在生活中,很多人都不知道300英雄三笠的稱號如何獲得是什么意思,其實他的意思是非常簡單的,下面就是小編搜索到的300英雄三笠的稱號如何獲得相關的一些知識,我們一起來學習下吧!參與活動,在300大作戰累計登錄滿7天,即可在300英雄獲得稱號。參與三笠祭所有活動前提條件:1、參與三笠祭所有活動,都需使用同一賬號登錄2個游戲,300大作戰和300英雄;2、三笠祭所有活動任務都需前往300大作戰...
【資料圖】哈嘍小伙伴們 ,今天給大家科普一個小知識。在日常生活中我們或多或少的都會接觸到明朝有朱歷這個皇帝嗎方面的一些說法,有的小伙伴還不是很了解,今天就給大家詳細的介紹一下關于明朝有朱歷這個皇帝嗎的相關內容。明朝皇帝:明太祖朱元璋、明惠帝朱允炆、明成祖朱棣、明仁宗朱高熾、明宣宗朱瞻基、明英宗朱祁鎮、明代宗朱祁鈺、明憲宗朱見深 、明孝宗朱佑樘、明武宗朱厚照、明世宗朱厚熜、明穆宗朱載垕、明神宗朱翊鈞...