您的位置:首页 > 编程语言 > Java开发

Spring框架之DI

2014-09-29 13:42 92 查看

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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: