學習IoC容器
- 基礎概念
- IOC(Inversion of Control)
-
- IOC建立對象的方式
- Spring的配置
- DI(Dependency Injection)
-
- 構造注入
- Set注入【重點】
- 擴充方式
基礎概念
耦合 :程式之間的依賴關系,包括類之間的依賴和方法之間的依賴。
解耦 :降低程式之間的依賴關系。 實際開發中,應該做到編譯時不依賴,運作時才依賴。
解耦的思路 :
- 使用反射來建立對象,避免使用new關鍵字;
- 通過讀取配置檔案來擷取要建立的對象的全類限定名。
IOC(Inversion of Control)
控制反轉(IoC, Inversion of Control),是一個概念,是一種思想。把建立對象的權利交給容器,通過容器來實作對象的裝配和管理。控制反轉就是對對象控制權的轉移,從程式代碼本身反轉到了外部容器。通過容器實作對象的建立,屬性指派,依賴的管理。作用是削減計算機的耦合,解除代碼中的依賴關系。不用new的方式去建立對象了。
IOC建立對象的方式
- 無參構造,預設就是無參構造的。
<bean id="user" class="com.zmqcode.User.User">
<property name="name" value="zmq"/>
</bean>
- 有參構造
<!--1、下标指派-->
<bean id="user" class="com.zmqcode.User.User">
<constructor-arg index="0" value="zmq"/>
</bean>
<!--2、通過類型建立-->
<bean id="user" class="com.zmqcode.User.User">
<!--基本類型可以直接type="int",引用類型必須全限定類名-->
<constructor-arg type="java.lang.String" value="zmq"/>
</bean>
不建議使用這種方法,如果構造器中傳入兩個同類型參數,沒辦法差別。
<!--3、直接通過參數名設定-->
<bean id="user" class="com.zmqcode.User.User">
<constructor-arg name="name" value="zmq"/>
</bean>
在配置檔案加載的時候,容器中管理的對象就已經被初始化了,即使沒有在測試類中用到。
Spring的配置
<alias name="user" alias="别名"/>
<bean id="user" class="com.zmqcode.User.User" name="别名">
<constructor-arg name="name" value="zmq"/>
</bean>
第二種方法更常用,name=“别名 别名2,别名3”
可以用逗号,空格,分号等分隔,取多個别名。
<import resource="beans_service.xml"/>
<import resource="beans.xml"/>
導入多個配置檔案
DI(Dependency Injection)
IoC 是一個概念,是一種思想,其實作方式多種多樣。目前比較流行的實作方式是依賴注入。容器能知道哪個類運作的時候需要另外一個類,就是一個對象的使用需要另一個對象。
依賴:bean對象的建立依賴于容器
注入:bean對象中的所有屬性,由容器來注入
構造注入
<bean id="user" class="com.zmqcode.User.User">
<constructor-arg name="name" value="zmq"/>
</bean>
Set注入【重點】
列舉了不同類型的注入方式
<bean id="address" class="com.zmqcode.set.Address">
<property name="address" value="武漢"/>
</bean>
<bean id="student" class="com.zmqcode.set.Student">
<!--普通值注入-->
<property name="name" value="zmq"/>
<!--bean對象注入-->
<property name="address" ref="address"/>
<!--數組注入-->
<!--這種方式和上面的方式都可以使用-->
<property name="books">
<array>
<value>西遊記</value>
<value>水浒傳</value>
<value>紅樓夢</value>
<value>三國演義</value>
</array>
</property>
<!--list注入-->
<property name="hobbits">
<list>
<value>聽歌</value>
<value>看電影</value>
</list>
</property>
<!--map注入-->
<property name="card">
<map>
<entry key="身份證" value="123"/>
<entry key="銀行卡" value="456"/>
</map>
</property>
<!--set注入-->
<property name="games">
<set>
<value>LOL</value>
<value>Dota</value>
</set>
</property>
<!--null注入-->
<property name="wife">
<null>
</null>
</property>
</bean>
擴充方式
p命名空間和c命名空間
- 導入依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
- 修改xml檔案,導入xml限制 ,添加第四行和第五行的内容
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
- 注入
<!--p命名空間注入。可以直接注入屬性,property-->
<bean id="user" class="com.zmqcode.User.UserT" p:name="zmq" p:age="2"/>
<!--c命名空間注入。類似于構造器注入,需要是有參的,類似construct-args-->
<bean id="user2" class="com.zmqcode.User.UserT" c:age="2" c:name="zmq"/>
關于注解注入的介紹在我的這一篇部落格中 注解
關于建立Spring項目需要的配置依賴在我的上一篇部落格中有提到。配置