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());
}
}