簡單理解什麼是Spring中的IOC控制反轉和DI依賴注入,Spring對象的三種創建方式

IOC :Inversion of Control 控制反轉
DI : dependency Injection 依賴注入

咋一聽,控制反轉、依賴注入,似乎很高大上的名字,概念比較抽象,但其實慢慢分析,轉換成自己的話也不難理解:

IOC的理解:

在原始社會的時候,我們需要自己生火、自己挖井。這個時候主動權在自己手裏。隨着時代的發展我們現在有燃氣公司和水利公司。我們現在想喝水直接扭水龍頭水就流出來了,但是水這個來源的控制權交給自來水公司了,這個過程稱之爲控制反轉

對於Spring來說,以前自己創建的對象UserService service = new UserServiceImpl(),
service.xxx()
而現在,對象的創建交給Spring工廠,用的時候去工廠中獲取,
ClassPathXmlApplicationContext ac = new …;

從之前自己創建對象,到現在交給Spring工廠創建對象,包括給屬性賦值也交給Spring工廠來完成,這個由我們自己完成一些事情轉移到Spring框架完成這些事情的過程,Spring稱之爲控制反轉(IOC)

在這裏插入圖片描述
DI (依賴注入):

如果我們站在spring工廠的角度,工廠創建需要的對象,並且還可以給程序員中的類的屬性賦值,對象由工廠創建,最終由程序員使用,這就是spring的依賴注入
在這裏插入圖片描述

IOC和DI實際上是等同的概念,如果要進行區分的話,IOC和DI可以理解爲同一個東西的不同角度看法,IOC
站在程序員的角度,以前創建對象是我們自己new出來的,現在讓容器自己創建,控制權交給了容器,對於
我們來說控制權反轉了。
DI是站在容器的角度,從Spring角度來看,用到的所有的對象都是自己創建的,並且對象在創建的時候需要
依賴的參數也是容器注入的,而這種維持對象之間依賴關係的方式就是依賴注入。

所以IOC和DI實際上都是指容器負責創建對象和維護對象之間依賴關係的這種行爲。

說到這裏,再來分析一下Spring創建對象的三種方式:

1,通過構造方法創建,採用默認的構造函數,
也就是通過xml+bean標籤,bean標籤要寫class的類的全限定名,其原理是通過java類的反射機制創建對象。
index : 參數的索引,從0 開始
name: 參數名
type:類型(區分開關鍵字和封裝類int 和Integer)

<bean id="peo" class="com.macw.pojo.People">
<!-- ref 引用另一個bean value 基本數據類型或String 等-->
    <constructor-arg index="0" name="id" type="int"  value="123"></constructor-arg>
    <constructor-arg index="1" name="name" type="java.lang.String" value="張三"></constructor-arg>
</bean>

在早期Spring1.0版本,還沒有註解的時候,Spring能夠幫我們創建對象和管理對象,
但是沒有註解每創建一個對象就要配置一個xml,其實還沒有我們直接new一個對象來得快呢,

但是爲什麼spring框架仍然有他的極大優勢呢,因爲他最重要的一個特性是能夠幫我們管理對象,
自己new對象在類中多處調用會造成程序模塊之間耦合性太強,不利於維護更新。而spring幫我們管理對象通過依賴注入聲明的是管理對象的關係。

2、通過實例工廠創建對象
也就是 工廠設計模式:幫助創建類對象,一個工廠可以生產多個對象

// 工廠,創建對象
public class StudentFactory {
    // 實例方法創建對象
    public Student getInstance() {
        return new User(001,"學生工廠:調用實例方法");
    }

    // 靜態方法創建對象
    public static Student getStaticInstance() {
        return new Student(002," 學生工廠:調用靜態方法");
    }
}

配置文件:

<!-- # 3.1 工廠類,實例方法 -->
    <!-- 先創建工廠 -->
    <bean id="factory" class="com.macw.StudentFactory"></bean>
    <!-- 在創建student對象,用factory方的實例方法 -->
    <bean id="student2" factory-bean="factory" factory-method="getInstance"></bean>

其中: factory-bean=”factory”指定工廠。factory-method=”getInstance”指定工廠的哪個方法。

3.靜態工廠創建對象,不需要創建工廠,快速創建對象

實現步驟:編寫一個靜態工廠(在方法上添加static)

public class StudentFactory{
    public static Student newInstance(){
        return new Student(001,"studentTest");
    }
}

在applicationContext.xml中
<bean  id = "student2"  class = "com.macw.pojo.StudentFactory"  factory-method = "newInstance"></bean>

在spring2.0之後採用註解的形式開發,減少了大量 的xml配置文件,開發的形式變爲xml+bean配置數據源,大量使用第三方框架,通過組件註解配置自己的類。

spring3.0之後採用配置類+bean註解來創建對象,目的想取代xml配置文件,也就是springboot自動裝配的底層原理

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