【微服務】Spring的IOC和DI

IOC概念和Spring中的IOC

Inversion 0f Control 把創建對象的權利交給框架。它包括Dependency Injection 和 Dependency Lookup。

IOC作用:消減計算機程序的耦合(依賴關係)。

Spring中基於XML的IOC環境搭建

在這裏插入圖片描述

ApplicationContext的三個實現類:

  • ClassPathXMLApplicationContext:它可以加載類路徑下的配置文件,要求配置文件必須在類路徑下,不在的話加在不了。

在這裏插入圖片描述

  • FileSystemXMLApplicationContext:它可以加載磁盤任意路徑下的配置文件(必須由訪問權限)

​image.png​

  • AnnotationConfigApplicationContext

核心容器的兩個接口引發出的問題:

ApplicationContext: 單例對象適用

它在構建核心容器時,創建對象採取的策略是採用立即加載的方式,只要讀完配置文件馬上就創建配置文件中配置的對象。

​image.png​

BeanFactory: 多例對象適用

它在創建核心容器時,創建對象採取的策略是採用延時加載的方式,即什麼時候根據ID獲取對象了,什麼時候創建對象。

​image.png​

Spring對bean的管理細節

創建bean的三種方式

第一種方式:使用默認構造函數創建。

在spring的配置文件中使用bean標籤,配以id和class屬性之後,且沒有其他屬性和標籤時。 採用的就是默認構造函數創建bean對象,此時如果類中沒有默認構造函數,則對象無法創建。

第二種方式: 使用普通工廠中的方法創建對象(使用某個類中的方法創建對象,並存入spring容器)

<bean id="instanceFactory" class="com.itheima.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

第三種方式:使用工廠中的靜態方法創建對象(使用某個類中的靜態方法創建對象,並存入spring容器)

​image.png​

<bean id="accountService" class="com.itheima.factory.StaticFactory" factory-method="getAccountService"></bean>

bean對象的作用範圍

bean標籤的scope屬性:用於指定bean的作用範圍

取值:

singleton:單例的(默認值)

prototype:多例的

request:作用於web應用的請求範圍

session:作用於web應用的會話範圍

global-session:作用於集羣環境的會話範圍(全局會話範圍),當不是集羣環境時,它就是session

全局session:

​image.png​

bean對象的聲明週期

單例對象:

出生:當容器創建時對象出生

活着:只要容器還在,對象一直活着

死亡:容器銷燬,對象消亡

總結:單例對象的生命週期和容器相同

多例對象:

出生:當我們使用對象時Spring爲我們創建

活着:對象只要是在使用過程中就一直活着

死亡:當對象長時間不使用,並且沒有別的對象引用時,垃圾回收機制銷燬對象

總結:

依賴注入(Dependency Injection)

依賴注入:

Dependency Injection

IOC的作用:

降低程序間的耦合(依賴關係)

依賴關係的管理:

以後都交給spring來維護

在當前類需要用到其他類的對象,由spring爲我們提供,我們只需要在配置文件中說明

依賴關係的維護:

就稱之爲依賴注入。

依賴注入三種類型:

       能注入的數據:有三類

​image.png​

注入的方式:有三種

第一種:使用構造函數提供

基本類型和String

其他bean類型(在配置文件中或者註解配置過的bean)

複雜類型/集合類型

構造函數

使用的標籤:constructor-arg

標籤出現的位置:bean標籤的內部

標籤中的屬性

type:用於指定要注入的數據的數據類型,該數據類型也是構造函數中某個或者某些參數的類型

index:用於指定要注入的數據給構造函數中指定索引位置的參數賦值。索引的位置是從0開始。

name:用於指定給構造函數中指定名稱的參數賦值

以上三個屬性用於指定給構造函數中哪個參數賦值

value:用於提供基本類型和string類型的數據

ref:用於指定其他的bean類型數據。它指在Spring的IOC核心容器中出現過的bean對象

優勢:

在獲取bean對象時,注入數據是必須的操作,否則對象無法創建成功。

弊端:

改變了bean對象的實例化方式,使我們創建對象時,如果用不到這些數據,也必須提供。

​image.png​

​image.png​

第二種:使用set方法提供

set方法注入

設計的標籤:property

出現的位置:bean標籤的內部

標籤的屬性:

name:用於指定注入時所調用的set方法名稱

value:用於提供基本類型和string類型的數據

ref:用於指定其他的bean類型數據。它指在Spring的IOC核心容器中出現過的bean對象

優勢:

創建對象時沒有明確的限制,可以直接使用默認構造函數

弊端:

如果有某個成員必須有值,則獲取對象是有可能set方法沒有執行

複雜類型的注入:

用於給List結構集合注入的標籤:List、Array、Set

用於給Map結構結合注入的標籤:Map、Props

結構相同,標籤可以互換。

①定義類,生成set方法

​image.png​

​image.png​

在配置文件配置,每一個類型配置相應的數據:

​image.png​

結果:

​image.png​

第三種:使用註解提供

詳情後續~~

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