文章目錄
- 什麼是控制反轉(Ioc)
- 控制反轉的作用
- 容器
- Spring容器高層視圖
-
- BeanFactory容器
- ApplicationContext容器
-
- ApplicationContext接口的實作類
- BeanFactory容器和ApplicationContext容器的差別
- 依賴注入
-
- 依賴注入的方法
-
- 構造方法注入
- setter方法注入
- 使用 p 名稱空間注入資料(本質還是調用 set 方法)
- 注入集合屬性
什麼是控制反轉(Ioc)
Spring 通過一個配置檔案描述 Bean 及 Bean 之間的依賴關系,利用 Java 語言的反射功能執行個體化Bean 并建立 Bean 之間的依賴關系。 Spring 的 IoC 容器在完成這些底層工作的基礎上,還提供了 Bean 執行個體緩存、生命周期管理、 Bean 執行個體代理、事件釋出、資源裝載等進階服務。
控制反轉的作用
- 管理對象的建立和依賴關系的維護。對象的建立并不是一件簡單的事,在對象關系比較複雜時,如果依賴關系需要程式猿來維護的話,那是相當頭疼的
- 解耦,由容器去維護具體的對象
- 托管了類的産生過程,比如我們需要在類的産生過程中做一些處理,最直接的例子就是代理,如果有容器程式可以把這部分處理交給容器,應用程式則無需去關心類是如何完成代理的
容器
Spring容器高層視圖
Spring 啟動時讀取應用程式提供的 Bean 配置資訊,并在 Spring 容器中生成一份相應的 Bean 配置系統資料庫,然後根據這張系統資料庫執行個體化 Bean,裝配好 Bean 之間的依賴關系,為上層應用提供準備就緒的運作環境。其中 Bean 緩存池為 HashMap 實作
BeanFactory容器
- 這個容器接口在
中被定義。org.springframework.beans.factory.BeanFactory
和相關的接口,比如BeanFactory
、BeanFactoryAware
、DisposableBean
,仍舊保留在 Spring 中,主要目的是向後相容已經存在的和那些 Spring 整合在一起的第三方架構。InitializingBean
- 在 Spring 中,有大量對
接口的實作。其中,最常被使用的是BeanFactory
類。這個容器從一個 XML檔案中讀取配置中繼資料,由這些中繼資料來生成一個被配置化的系統或者應用。XmlBeanFactory
- 在資源寶貴的移動裝置或者基于 applet 的應用當中,
會被優先選擇。否則,一般使用的是BeanFactory
,除非你有更好的理由選擇ApplicationContext
。BeanFactory
ApplicationContext容器
ApplicationContext
是
BeanFactory
的子接口,
ApplicationContext
是 spring 中較進階的容器。和
BeanFactory
類似,它可以加載配置檔案中定義的 bean,将所有的 bean 集中在一起,當有請求的時候配置設定 bean。 另外,它增加了企業所需要的功能,比如,從屬性檔案中解析文本資訊和将事件傳遞給所指定的監聽器。這個容器在
org.springframework.context.ApplicationContext interface
接口中定義。
ApplicationContext
包含
BeanFactory
所有的功能,一般情況下,相對于
BeanFactory
,
ApplicationContext
會更加優秀。
ApplicationContext接口的實作類
-
ClassPathXmlApplicationContext
它是從類的根路徑下加載配置檔案
-
FileSystemXmlApplicationContext
它是從磁盤路徑上加載配置檔案,配置檔案可以在磁盤的任意位置
-
AnnotationConfigApplicationContext
當我們使用注解配置容器對象時,需要使用此類來建立 spring 容器。它用來讀取注解。
-
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>