spring的DI(依賴注入)
就是給bean對象的屬性指派。
1、 通過bean對象的屬性的set方法給此屬性進行指派(或參考:spring07_DI_set工程)
被指派的屬性必須要有set方法。
代碼示例:
要被指派的對象
//要被執行個體化的對象
public class User implements Serializable {
//基本類型
private Integer uid;
private String name;
//引用類型
private Book book;
//Set集合
private Set set;
//Map集合
private Map map;
//List集合
private List list;
//Properties配置檔案格式
private Properties properties;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public Set getSet() {
return set;
}
public void setSet(Set set) {
this.set = set;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
spring配置檔案
<?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-2.5.xsd">
<!-- 給bean對象的屬性進行初始化指派,用屬性的set方法-->
<!-- 注冊Book對象 -->
<bean id="bookObj"class="cn.domain.Book" scope="prototype"></bean>
<!-- 注冊User對象,并為此User對象的屬性進行初始化指派,調用的是此屬性的set方法進行賦的值 -->
<bean id="user"class="cn.domain.User">
<!-- 給uid屬性指派 -->
<property name="uid"value="1" />
<!-- 給name屬性指派 -->
<property name="name"value="張三" />
<!-- 給book引用類型變量指派 -->
<property name="book">
<!--bean引用的是以上Book對象的id屬性,表示建立一個以上的Book對象指派給此book屬性 -->
<ref bean="bookObj"/>
</property>
<!-- 給List集合指派 -->
<property name="list">
<list>
<!-- 向此list集合中存入“list内容1”字元串 -->
<value>list内容1</value>
<!-- 給此list集合中存入引用類型的對象 -->
<ref bean="bookObj"/>
<value>list内容2</value>
</list>
</property>
<!-- 給Set集合指派 -->
<property name="set">
<set>
<!-- 存入字元串“set内容1” -->
<value>set内容1</value>
<!-- 向此set集合中添加一個引用類型的對象 -->
<ref bean="bookObj"/>
<value>123</value>
</set>
</property>
<!-- 給Map集合指派 -->
<property name="map">
<map>
<!-- 一個entry标簽表示一個映射關系 -->
<entry key="key1">
<value>value1</value>
</entry>
<!-- 向map集合中存儲一個引用類型的對象 -->
<entry key="key2">
<ref bean="bookObj"/>
</entry>
</map>
</property>
<!-- 向Properties對象中注入映射關系(注意Properties對象的key和value必須是String類型的) -->
<property name="properties">
<props>
<!-- 向properties屬性對象中插入映射關系(一個prop标簽代表一個映射關系),此對象中的映射關系的值隻能是String類型的,是以沒有ref标簽 -->
<prop key="prop1">
prop内容1
</prop>
<prop key="prop2">
prop内容2
</prop>
<prop key="prop3">
prop内容3
</prop>
</props>
</property>
</bean>
<!--
從以上代碼中可以看出,如果給一個屬性或容器指派,隻要指派引用類型對象,就用ref标簽。如果指派基本類型的值,就直接用value标簽來指派(基本類型會自動轉換)。
-->
</beans>
測試代碼
public class UserTest extends SpringInit{
//給bean對象的屬性進行初始化指派,用屬性的set方法
@Test
public void test(){
//獲的user對象
User user = (User)applicationContext.getBean("user");
//列印user中被初始化的值
System.out.println("uid="+user.getUid());
System.out.println("name="+user.getName());
System.out.println("book="+user.getBook());
//列印set屬性的值
System.out.println("set=");
for(Object obj : user.getSet()){
System.out.println(" "+obj);
}
//列印list屬性的值
System.out.println("list=");
for(Object obj : user.getList()){
System.out.println(" "+obj);
}
//列印map屬性的值
System.out.println("map=");
for(Entry ent : (Set<Entry>)user.getMap().entrySet()){
System.out.println(" "+ent.getKey()+":"+ent.getValue());
}
//列印properties屬性的值
System.out.println("properties=");
for(Entry ent : user.getProperties().entrySet()){
System.out.println(" "+ent.getKey()+":"+ent.getValue());
}
}
}
2、 通過bean對象的構造函數給此對象的屬性初始化(或參考:spring08_DI_constructor工程)
首先在Bean對象中建立帶參數的構造函數,然後在配置檔案中配置此陪的有參構造方法,那麼執行個體化此對象時調用的就是配置的有參的構造方法。
代碼示例:
要被指派的對象
//要被執行個體化的對象
public class User implements Serializable {
//基本類型
private String name;
//引用類型
private Book book;
//Map集合
private Map map;
//構造方法初始化name屬性和book屬性,及一個Map集合
public User(String name, Book book, Map map){
this.name = name;
this.book = book;
this.map = map;
}
public String getName() {
return name;
}
public Book getBook() {
return book;
}
public Map getMap() {
return map;
}
}
spring的配置檔案
<?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-2.5.xsd">
<!-- 給bean對象的屬性進行初始化指派,用屬性的set方法-->
<!-- 注冊Book對象 -->
<bean id="bookObj"class="cn.domain.Book" scope="prototype"></bean>
<!-- 注冊User對象,并調用其有參構造方法進行對屬性指派 -->
<bean id="user"class="cn.domain.User">
<!--
constructor-arg标簽表示構造方法所接收的參數
index: 表示此參數的下标(從0開始)
type: 此參數的類型
value: 給此參數要符的值(value隻能賦基類類型的值)
ref: 表示給此引用類型變量指派
-->
<constructor-arg index="0" type="java.lang.String"value="張三"></constructor-arg><!-- 此參數對應name屬性 -->
<constructor-arg index="1" type="cn.domain.Book"ref="bookObj"></constructor-arg><!-- 此參數對應book屬性 -->
<constructor-arg index="2" type="java.util.Map"><!-- 此參數對應map屬性 -->
<map>
<!-- 一個entry标簽表示一個映射關系 -->
<entry key="key1">
<value>value1</value>
</entry>
<!-- 向map集合中存儲一個引用類型的對象 -->
<entry key="key2">
<ref bean="bookObj"/>
</entry>
</map>
</constructor-arg>
</bean>
<!--constructor-arg标簽表示有參構造的參數。如果bean标簽中沒有constructor-arg标簽,spring将調用預設的無參構造函數 -->
</beans>
測試代碼
//給bean對象的屬性進行初始化指派,用帶參構造方法初始化
@Test
public void test(){
//獲的user對象
User user = (User)applicationContext.getBean("user");
//列印user中被初始化的值
System.out.println("name="+user.getName());
System.out.println("book="+user.getBook());
//列印map屬性的值
System.out.println("map=");
for(Entry ent : (Set<Entry>)user.getMap().entrySet()){
System.out.println(" "+ent.getKey()+":"+ent.getValue());
}
}