Spring(IOC&DI)

JasonTam發表於2018-08-16

首先為什麼會有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 將類的依 賴的屬性設定進去.

  • 注入方式
  1. set方法注入
  2. 構造方法注入
  3. 欄位注入
  • 注入型別
  1. 值型別注入(基本八大型別)

  2. 引用型別注入(將依賴物件注入)

  3. 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屬性.==

  1. 建構函式注入

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;
	}
複製程式碼
  1. 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>
複製程式碼
  1. 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,跟之前的引用型別用法一樣

  1. 複雜型別注入

陣列,集合,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>
複製程式碼

相關文章