Spring基礎 - Spring核心之控制反轉(IOC)

欢乐豆123發表於2024-06-08

Spring基礎 - Spring核心之控制反轉(IOC)

概要

我們知道,Spring提供的容器又稱為IoC容器。其實,IoC(Inversion of control )不是 Spring 提出來的,它們在 Spring 之前其實已經存在了,只不過當時更加偏向於理論。Spring 在技術層次將這個思想進行了很好的實現。

一、IoC(Inversion of Control )

1. 什麼是IoC?

IoC 即控制反轉/反轉控制。它是一種思想不是一個技術實現。描述的是:Java 開發領域物件的建立以及管理的問題。

例如:現有類 A 依賴於類 B

傳統的開發方式 :往往是在類 A 中手動透過 new 關鍵字來 new 一個 B 的物件出來使用

IoC 思想的開發方式 :不透過 new 關鍵字來建立物件,而是透過 IoC 容器(Spring 框架) 來幫助我們例項化物件。我們需要哪個物件,直接從 IoC 容器裡面去取即可。

從以上兩種開發方式的對比來看:我們 “喪失了一個權力” (建立、管理物件的權力),從而也得到了一個好處(不用再考慮物件的建立、管理等一系列的事情)

2、為什麼叫控制反轉?

控制 :指的是物件建立(例項化、管理)的權力

反轉 :控制權交給外部環境(IoC 容器)

3. IoC 解決了什麼問題?

IoC 的思想就是兩方之間不互相依賴,由第三方容器來管理相關資源。這樣有什麼好處呢?

1)物件之間的耦合度或者說依賴程度降低;

2)資源變的容易管理;比如你用 Spring 容器提供的話很容易就可以實現一個單例。

例如:現有一個針對 User 的操作,利用 Service 和 Dao 兩層結構進行開發在沒有使用 IoC 思想的情況下,Service 層想要使用 Dao 層的具體實現的話,需要透過 new 關鍵字在UserServiceImpl 中手動 new 出 IUserDao 的具體實現類 UserDaoImpl(不能直接 new 介面類)。如下圖:

很完美,這種方式也是可以實現的,但是我們想象一下如下場景:開發過程中突然接到一個新的需求,針對IUserDao 介面開發出另一個具體實現類。因為 Server 層依賴了IUserDao的具體實現,所以我們需要修改UserServiceImpl中 new 的物件。如果只有一個類引用了IUserDao的具體實現,可能覺得還好,修改起來也不是很費力氣,但是如果有許許多多的地方都引用了IUserDao的具體實現的話,一旦需要更換IUserDao 的實現方式,那修改起來將會非常的頭疼。如下圖:

使用 IoC 的思想,我們將物件的控制權(建立、管理)交有 IoC 容器去管理,我們在使用的時候直接從 IoC 容器中獲取就可以了。

二、DI(Dependency Injection)

依賴注入是 IoC 的一種實現方式

依賴注入可以透過set()方法實現。但依賴注入也可以透過構造方法實現

參考連結:https://javaguide.cn/system-design/framework/spring/ioc-and-aop.html

相關文章