天天看點

Spring控制反轉(Ioc)與依賴注入(DI)什麼是控制反轉(Ioc)控制反轉的作用容器Spring容器高層視圖依賴注入

文章目錄

  • 什麼是控制反轉(Ioc)
  • 控制反轉的作用
  • 容器
  • Spring容器高層視圖
    • BeanFactory容器
    • ApplicationContext容器
      • ApplicationContext接口的實作類
    • BeanFactory容器和ApplicationContext容器的差別
  • 依賴注入
    • 依賴注入的方法
      • 構造方法注入
      • setter方法注入
      • 使用 p 名稱空間注入資料(本質還是調用 set 方法)
      • 注入集合屬性

什麼是控制反轉(Ioc)

Spring 通過一個配置檔案描述 Bean 及 Bean 之間的依賴關系,利用 Java 語言的反射功能執行個體化Bean 并建立 Bean 之間的依賴關系。 Spring 的 IoC 容器在完成這些底層工作的基礎上,還提供了 Bean 執行個體緩存、生命周期管理、 Bean 執行個體代理、事件釋出、資源裝載等進階服務。

控制反轉的作用

  1. 管理對象的建立和依賴關系的維護。對象的建立并不是一件簡單的事,在對象關系比較複雜時,如果依賴關系需要程式猿來維護的話,那是相當頭疼的
  2. 解耦,由容器去維護具體的對象
  3. 托管了類的産生過程,比如我們需要在類的産生過程中做一些處理,最直接的例子就是代理,如果有容器程式可以把這部分處理交給容器,應用程式則無需去關心類是如何完成代理的

容器

Spring容器高層視圖

Spring 啟動時讀取應用程式提供的 Bean 配置資訊,并在 Spring 容器中生成一份相應的 Bean 配置系統資料庫,然後根據這張系統資料庫執行個體化 Bean,裝配好 Bean 之間的依賴關系,為上層應用提供準備就緒的運作環境。其中 Bean 緩存池為 HashMap 實作

Spring控制反轉(Ioc)與依賴注入(DI)什麼是控制反轉(Ioc)控制反轉的作用容器Spring容器高層視圖依賴注入

BeanFactory容器

  • 這個容器接口在

    org.springframework.beans.factory.BeanFactory

    中被定義。

    BeanFactory

    和相關的接口,比如

    BeanFactoryAware

    DisposableBean

    InitializingBean

    ,仍舊保留在 Spring 中,主要目的是向後相容已經存在的和那些 Spring 整合在一起的第三方架構。
  • 在 Spring 中,有大量對

    BeanFactory

    接口的實作。其中,最常被使用的是

    XmlBeanFactory

    類。這個容器從一個 XML檔案中讀取配置中繼資料,由這些中繼資料來生成一個被配置化的系統或者應用。
  • 在資源寶貴的移動裝置或者基于 applet 的應用當中,

    BeanFactory

    會被優先選擇。否則,一般使用的是

    ApplicationContext

    ,除非你有更好的理由選擇

    BeanFactory

ApplicationContext容器

ApplicationContext

BeanFactory

的子接口,

ApplicationContext

是 spring 中較進階的容器。和

BeanFactory

類似,它可以加載配置檔案中定義的 bean,将所有的 bean 集中在一起,當有請求的時候配置設定 bean。 另外,它增加了企業所需要的功能,比如,從屬性檔案中解析文本資訊和将事件傳遞給所指定的監聽器。這個容器在

org.springframework.context.ApplicationContext interface

接口中定義。

ApplicationContext

包含

BeanFactory

所有的功能,一般情況下,相對于

BeanFactory

ApplicationContext

會更加優秀。

ApplicationContext接口的實作類

  1. ClassPathXmlApplicationContext

    它是從類的根路徑下加載配置檔案

  2. FileSystemXmlApplicationContext

    它是從磁盤路徑上加載配置檔案,配置檔案可以在磁盤的任意位置

  3. AnnotationConfigApplicationContext

    當我們使用注解配置容器對象時,需要使用此類來建立 spring 容器。它用來讀取注解。

  4. WebXmlApplicationContext

    該容器會在一個 web 應用程式的範圍内加載在 XML 檔案中已被定義的 bean。

BeanFactory容器和ApplicationContext容器的差別

依賴注入

依賴注入:Dependency Injection。它是 spring 架構核心 ioc 的具體實作。我們的程式在編寫時,通過控制反轉,把對象的建立交給了 spring,但是代碼中不可能出現沒有依賴的情況。ioc 解耦隻是降低他們的依賴關系,但不會消除。例如:我們的業務層仍會調用持久層的方法。那這種業務層和持久層的依賴關系,在使用 spring 之後,就讓 spring 來維護了。簡單的說,就是坐等架構把持久層對象傳入業務層,而不用我們自己去擷取。

依賴注入的方法

構造方法注入

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> 
<constructor-arg name="name" value="張三"></constructor-arg>
 <constructor-arg name="age" value="18"></constructor-arg> 
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean> 

<bean id="now" class="java.util.Date"></bean>
在這裡插入代碼片
           

屬性:

  • index:指定參數在構造函數參數清單的索引位置
  • type:指定參數在構造函數中的資料類型
  • name:指定參數在構造函數中的名稱
  • value:它能賦的值是基本資料類型和String類型
  • ref:它能賦的值是其他bean類型,也就是說,必須得是在配置檔案中配置過的bean

setter方法注入

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> 
<property name="name" value="test"></property> 
<property name="age" value="21"></property>
 <property name="birthday" ref="now"></property>
</bean> 

<bean id="now" class="java.util.Date"></bean>
           

屬性:

name:找的是類中set方法後面的部分

ref:它能賦的值是其他bean類型

value:給屬性指派是基本資料類型和String類型的

使用 p 名稱空間注入資料(本質還是調用 set 方法)

此種方式是通過在 xml 中導入 p 名稱空間,使用 p:propertyName 來注入資料,它的本質仍然是調用類中的set 方法實作注入功能。

注入集合屬性

元素 描述
list 它有助于連線,如注入一列值,允許重複
set 它有助于連線一組值,但不能重複
map 它可以用來注入名稱-值對的集合,其中名稱和值可以是任何類型
props 它可以用來注入名稱-值對的集合,其中名稱和值都是字元串類型
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<!-- 在注入集合資料時,隻要結構相同,标簽可以互換 -->
<!-- 給數組注入資料 -->
 <property name="myStrs">
  <array>
  <value>AAA</value> 
  <value>BBB</value> 
  <value>CCC</value>
</array>
</property>
<!-- 注入 list 集合資料 -->
 <property name="myList">
  <list>
   <value>AAA</value> 
   <value>BBB</value> 
   <value>CCC</value>
</list>
</property>
<!-- 注入 set 集合資料 --> 
<property name="mySet">
 <set>
 <value>AAA</value> 
 <value>BBB</value>
  <value>CCC</value>
</set>
</property>
<!-- 注入 Map 資料 -->
 <property name="myMap"> 
 <props> 
 <prop key="testA">aaa</prop>
 <prop key="testB">bbb</prop>
</props>
</property>
<!-- 注入 properties 資料 -->
<property name="myProps"> 
<map>
<entry key="testA" value="aaa"></entry> 
<entry key="testB"> <value>bbb</value></entry>
</map>
</property>
</bean>