使用XML装配Bean需要定义对应的XML,这里需要引入对应的XML模式(XSD)文件,这些文件会定义配置Spring 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">
<!-- 配置代码 -->
</beans>
装配简单值
先来一个最简单的装配,XML代码如下:
<bean id="source" class="Juice.main.pojo.Source">
<property name="fruit" value="橙汁"></property>
<property name="size" value="2"></property>
<property name="sugar" value="少糖"></property>
</bean>
简单的解释一下:
- id属性是Spring找到的这个Bean的编号,不过id不是一个必需的属性,如果没有声明它,那么Spring将会采用 “全限定名#{number}” 的格式生产编号。如果只声明了这样的类,而没有声明id,那么SPring为其生产的编号就是“com.ssm.learn.pojo.Role#0”。
- class显然就是一个类的全限定名。
- property元素是定义类的属性,其中name属性定义的是属性名称,而value是其值。
装配集合
有时候要做一些复制的装配工作,比如Set、Map、Array和Properties等。为了很好的介绍,我们举一个例子来说明一下。首先我们新建一个Bean,代码如下:
package Juice.main.pojo;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class complex {
private Long id;
private List<String> list;
private Map<String,String> map;
private Properties props;
private Set<String> set;
private String[] array;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public Properties getProps() {
return props;
}
public void setProps(Properties props) {
this.props = props;
}
public Set<String> getSet() {
return set;
}
public void setSet(Set<String> set) {
this.set = set;
}
public String[] getArray() {
return array;
}
public void setArray(String[] array) {
this.array = array;
}
}
为此可以这样装配这些属性。
<bean id="complex" class="Juice.main.pojo.complex">
<property name="id" value="1" />
<property name="list">
<list>
<value>value-list-1</value>
<value>value-list-2</value>
<value>value-list-3</value>
</list>
</property>
<property name="map">
<map>
<entry key="key1" value="value-key-1" />
<entry key="key2" value="value-key-2" />
<entry key="key3" value="value-key-3" />
</map>
</property>
<property name="props">
<props>
<prop key="prop1">value-prop-1</prop>
<prop key="prop1">value-prop-2</prop>
<prop key="prop1">value-prop-3</prop>
</props>
</property>
<property name="set">
<set>
<value>value-set-1</value>
<value>value-set-2</value>
<value>value-set-3</value>
</set>
</property>
<property name="array">
<array>
<value>value-array-1</value>
<value>value-array-2</value>
<value>value-array-3</value>
</array>
</property>
</bean>
当然这里的装配主要集中在比较简单的String类型上,其主要的目的是告诉大家如何装配简易的数据到集合中。
从上面可以看到对字符串的各个集合的装载,但是有些时候可以需要更为复杂的装载,比如一个list可以是一个系列类的对象,又如一个Map集合类,键可以是一个类对象,而值也是一个类对象。为此,我们再来举一个简单的例子。
public class Role {
private Long id;
private String roleName;
private String note;
}
public class User {
private Long id;
private String userName;
private String note;
}
public class UserRoleAdd {
private Long id;
private List<Role> list;
private Map<Role,User> map;
private Set<Role> set;
}
这里可以看到,对于List、Map和Set等集合类使用的是类对象,不过不用担心,Spring IoC容器提供了对应的配置方法,代码如下:
<bean id="role1" class="Juice.main.pojo.Role">
<property name="id" value="1" />
<property name="roleName" value="role_name_1" />
<property name="note" value="role_note_1" />
</bean>
<bean id="role2" class="Juice.main.pojo.Role">
<property name="id" value="2" />
<property name="roleName" value="role_name_2" />
<property name="note" value="role_note_2" />
</bean>
<bean id="user1" class="Juice.main.pojo.User">
<property name="id" value="1" />
<property name="userName" value="user_name_1" />
<property name="note" value="user_note_1" />
</bean>
<bean id="user2" class="Juice.main.pojo.User">
<property name="id" value="2" />
<property name="userName" value="user_name_2" />
<property name="note" value="user_note_2" />
</bean>
<bean id="userRoleAdd" class="Juice.main.pojo.UserRoleAdd">
<property name="id" value="1" />
<property name="list">
<list>
<ref bean="role1" />
<ref bean="role2" />
</list>
</property>
<property name="map">
<map>
<entry key-ref="role1" value-ref="user1" />
<entry key-ref="role2" value-ref="user2" />
</map>
</property>
<property name="set">
<set>
<ref bean="role1" />
<ref bean="role2" />
</set>
</property>
</bean>
这里先定义了两个角色Bean(role1和role2)和两个用户(user1和user2),它们和之前的定义并没有什么不同,只是后面的定义稍微不一样。
命名空间装配
除了上述的配置之外,Spring还提供了对应的命名空间的定义,只是在使用命名空间的时候要先引入对应的命名空间和XML模式。比如我们用这个模式来定义userRoleAdd类实例。
<?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:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="role1" class="Juice.main.pojo.Role"
c:_0="1" c:_1="role_name_1" c:_2="role_note_1" />
<bean id="role2" class="Juice.main.pojo.Role"
p:id="2" p:roleName="role_name_2" p:note="role_note_2" />
<bean id="user1" class="Juice.main.pojo.User"
p:id="1" p:userName="user_name_1" p:note="user_note_1" />
<bean id="user2" class="Juice.main.pojo.User"
p:id="2" p:userName="user_name_2" p:note="user_note_2" />
<util:list id="list">
<ref bean="role1" />
<ref bean="role2" />
</util:list>
<util:map id="map">
<entry key-ref="role1" value-ref="user1" />
<entry key-ref="role2" value-ref="user2" />
</util:map>
<util:set id="set">
<ref bean="role1" />
<ref bean="role2" />
</util:set>
<bean id="userRoleAdd" class="Juice.main.pojo.UserRoleAdd"
p:id="1" p:list-ref="list" p:map-ref="map" p:set-ref="set" />
</beans>