首先為什麼會有IOC(Inverse of Control)?
在開發中,會寫很多的類,而有些類之間不可避免的產生依賴關係,這種依賴關係稱之為耦合.
例如:service層必須依賴dao層
public class CustomerService {
private CustomerDao dao = new CustomerDao();
}
複製程式碼
解決這個問題,可以使用配置檔案配置.
所以就引出了工廠模式解耦.
什麼是工廠模式解耦?
就是把所有需要使用到物件,使用配置檔案配置.在伺服器啟動的時候進行載入.通過讀取配置檔案,將配置檔案中的物件存放起來,當需要使用的時候,拿出來使用.於是就引出了IOC思想了.
控制反轉-Inverse of Control
由於我們需要將配置檔案的物件存放起來,所以我們需要使用集合來做存放物件的容器.因此我們要在應用載入的時候,建立一個Map,並將我們所需要的物件存放起來.工廠就是負責從這個容器中獲取我們指定物件的容器.
所以IOC就是將我們建立物件的方式反轉了,以前建立物件是由開發人員主動執行的,包括依賴關係也是.==但是我們使用了spring之後,物件的建立以及依賴關係可以由spring完成建立以及注入.反轉控制就是反轉了我們建立物件的方式,從我們自己建立反轉給了spring建立
物件的建立權反轉(交給)給 Spring.作用是實現了程式的解耦合.
DI(Dependency Injection)依賴注入
實現IOC思想需要DI的支援
需要有 IOC 的環境,Spring 建立這個類的過程中,Spring 將類的依 賴的屬性設定進去.
- 注入方式
- set方法注入
- 構造方法注入
- 欄位注入
- 注入型別
-
值型別注入(基本八大型別)
-
引用型別注入(將依賴物件注入)
-
set方式注入
- 屬性注入
<bean name="user" class="com.demo.pojo.User">
<property name="name" value="tom"></property>
<property name="age" value="18"></property>
</bean>
複製程式碼
- 物件注入
<bean name="user" class="com.demo.pojo.User">
<property name="name" value="tom"></property>
<property name="age" value="18"></property>
<property name="Car" ref="car"></property>
</bean>
<bean name="car" class="com.demo.pojo.Car">
<property name="name" value="AE86"></property>
<property name="color" value="白色"></property>
</bean>
複製程式碼
==注意:值型別使用value屬性,引用型別使用ref屬性.==
- 建構函式注入
constructor-arg元素
屬性 | 詳解 |
---|---|
name | 物件的屬性名 |
value | 值 |
ref | 引用什麼物件 |
index | 建構函式的引數列表的順序 |
type | 建構函式的引數型別. |
<bean name="user" class="com.demo.pojo.User">
<constructor-arg name="name" value="666" index="1" type="java.lang.Integer"></constructor-arg>
<constructor-arg name="car" ref="car" index="0"></constructor-arg>
</bean>
//構造方法
public User(String name, Car car) {
this.name = name;
this.car = car;
}
public User(Car car, Integer name) {
this.name = name+"";
this.car = car;
}
複製程式碼
- p名稱空間注入
前置工作:需要匯入p名稱空間
在根元素中新增以下的這段程式碼
xmlns:p="http://www.springframework.org/schema/p"
複製程式碼
其實就是set注入方法
<bean name="user2" class="com.demo.pojo.User" p:name="tom"
p:age="18" p:car-ref="car"></bean>
複製程式碼
- spel 注入
<!-- spring expression language -->
<bean name="user3" class="com.demo.pojo.User">
<property name="name" value="#{user.name}"></property>
<property name="age" value="#{user1.age}"></property>
<property name="car" ref="car"></property>
</bean>
複製程式碼
注意:引用型別不能使用spel,跟之前的引用型別用法一樣
- 複雜型別注入
陣列,集合,Map集合,Properties
注意:資料與集合當值只有一個的時候,值可以寫在property元素中的value屬性中
<property name="arr" value="tom"></property>
<property name="list" value="jerry"></property>
複製程式碼
<bean name="cb" class="com.demo.pojo.CollectionBean">
<property name="arr">
<array>
<value>tom</value>
<value>jerry</value>
<ref bean="car"/>
</array>
</property>
<property name="list">
<list>
<value>#{user.name}</value>
<value>#{user.age}</value>
<ref bean="car"/>
</list>
</property>
<property name="map">
<map>
<entry key="name" value="mama"></entry>
<entry key="uu" value-ref="user2"></entry>
<entry key-ref="user2" value-ref="user3"></entry>
</map>
</property>
<property name="prop">
<props>
<prop key="name">tom</prop>
<prop key="age">18</prop>
</props>
</property>
</bean>
複製程式碼