依賴注入:Dependency Injection
IOC的作用:降低程序間的耦合(依賴關係)
依賴關係的管理:交給spring來維護
在當前類需要用到其他類的對象,由spring提供,我們只需要在配置文件中說明。
依賴關係的維護就稱之爲依賴注入。
依賴注入的方式
第一種:使用構造函數注入
User實體類中的屬性爲: String userName; int age;Date date;沒有提供默認構造函數
使用的標籤:constructor-arg
標籤出現的位置:bean標籤的內部
標籤中的屬性
type:用於指定要注入的數據的數據類型,該數據類型也是構造函數中某個或某些參數的類型
index:用於指定要注入的數據給構造函數中指定索引位置的參數賦值。索引的位置是從0開始
name:用於指定給構造函數中指定名稱的參數賦值
----------------------以上三個用於指定給構造函數中哪個參數賦值------------------------------
value:用於提供基本類型和String類型的數據
ref:用於指定其他的bean類型數據。它指的就是在spring的Ioc核心容器中出現過的bean對象
優勢:
在獲取bean對象時,注入數據是必須的操作,否則對象無法創建成功。
弊端:
改變了bean對象的實例化方式,使我們在創建對象時,如果用不到這些數據,也必須提供。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--構造函數注入-->
<bean id="user" class="cn.td.domain.User" scope="singleton">
<constructor-arg name="userName" value="張三"/>
<constructor-arg name="age" value="18"/>
<constructor-arg name="date" ref="data"/>
</bean>
<bean id="data" class="java.util.Date"/>
</beans>
第二種:使用set方法注入
set方法注入更常用
涉及的標籤:property
出現的位置:bean標籤的內部
標籤的屬性
name:用於指定注入時所調用的set方法名稱
value:用於提供基本類型和String類型的數據
ref:用於指定其他的bean類型數據。它指的就是在spring的Ioc核心容器中出現過的bean對象
優勢:
創建對象時沒有明確的限制,可以直接使用默認構造函數
弊端:
如果有某個成員必須有值,則獲取對象是有可能set方法沒有執行。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置日期對象 -->
<bean id="data" class="java.util.Date"/>
<!--set注入-->
<bean id="user" class="cn.td.domain.User" scope="singleton">
<property name="userName" value="張三"/>
<property name="age" value="18"/>
<property name="date" ref="data"/>
</bean>
</beans>
依賴注入的數據類型
基本類型和String
User實體類中的屬性爲: String userName; int age;
<bean id="user" class="cn.td.domain.User" scope="singleton">
<constructor-arg name="userName" value="張三"/>
<constructor-arg name="age" value="18"/>
</bean>
其他bean類型(在配置文件中或者註解配置過的bean)
User實體類中的屬性爲: String userName; int age;Date date;
其中,Date類型不是基本類型和String類型此時,應在配置文件中配置一個日期對象,然後再用ref引入
<bean id="user" class="cn.td.domain.User" scope="singleton">
<constructor-arg name="userName" value="張三"/>
<constructor-arg name="age" value="18"/>
<constructor-arg name="date" ref="data"/>
</bean>
<bean id="data" class="java.util.Date"/>
複雜類型/集合類型
複雜類型/集合類型注入時,結構相同,標籤可以互換
User中的屬性
String[] strings; List list; Set set; Map<String,String> map; Properties prop;
用於給List結構集合注入的標籤: array list set
用於給數組注入
<!--數組注入-->
<bean id="user" class="cn.td.domain.User">
<property name="strings">
<array>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</array>
</property>
</bean>
用於給List注入
<bean id="user" class="cn.td.domain.User">
<property name="list">
<list>
<value>listaaa</value>
<value>listbbb</value>
<value>listccc</value>
</list>
</property>
</bean>
用於給set注入
<bean id="user" class="cn.td.domain.User">
<property name="set">
<list>
<value>setaaa</value>
<value>setbbb</value>
<value>setccc</value>
</list>
</property>
</bean>
用於個Map結構集合注入的標籤: map props
用於給map注入
<bean id="user" class="cn.td.domain.User">
<property name="map">
<map>
<entry key="mapA" value="mapa"/>
<entry key="mapB" value="mapb"/>
<entry key="mapC" value="mapc"/>
</map>
</property>
</bean>
用於給 props注入
<bean id="user" class="cn.td.domain.User">
<property name="prop">
<props>
<prop key="propA">propa</prop>
<prop key="propB">propb</prop>
<prop key="propC">propc</prop>
</props>
</property>
</bean>