7.11.1 使用p命名空间简化配置

7.11.1 使用p:命名空间简化配置

p:命名空间甚至不需要特定的Schema定义,它直接存在于Spring内核中。与前面用<property>元素定义Bean的属性不同的是,当导入p:命名空间之后,就可直接在<bean>元素中使用属性来驱动执行setter方法

程序示例

假设有如下的持久化类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\p_namespace
└─src\
├─beans.xml
├─lee\
│ └─BeanTest.java
└─org\
└─crazyit\
└─app\
└─service\
├─Axe.java
├─impl\
│ ├─Chinese.java
│ ├─SteelAxe.java
│ └─StoneAxe.java
└─Person.java

Chinese.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package org.crazyit.app.service.impl;

import org.crazyit.app.service.*;

public class Chinese implements Person
{
private Axe axe;
private int age;
public Chinese()
{
}
// axe的setter方法
public void setAxe(Axe axe)
{
this.axe = axe;
}
// age的setter方法
public void setAge(int age)
{
this.age = age;
}
// 实现Person接口的useAxe()方法
public void useAxe()
{
System.out.println(axe.chop());
System.out.println("age成员变量的值:" + age);
}
}

上面的持久化类中有setAxe()setAge()两个setter方法可通过设值注入来驱动,如果采用原来的配置方式,则需要使用<property>元素来驱动它们。但如果采用p:命名空间,则可直接采用属性来配置它们。本应用的配置文件如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="GBK"?>
<!-- 指定Spring配置文件的根元素和Schema 并导入p:命名空间的元素 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置chinese实例,其实现类是Chinese -->
<bean id="chinese" class="org.crazyit.app.service.impl.Chinese"
p:age="29" p:axe-ref="stoneAxe" />
<!-- 配置steelAxe实例,其实现类是SteelAxe -->
<bean id="steelAxe"
class="org.crazyit.app.service.impl.SteelAxe" />
<!-- 配置stoneAxee实例,其实现类是StoneAxe -->
<bean id="stoneAxe"
class="org.crazyit.app.service.impl.StoneAxe" />
</beans>

导入p:命名空间

配置文件中<beans>元素中的xmlns:p属性:

1
xmlns:p="http://www.springframework.org/schema/p"

用于导入XML Schema里的p:命名空间

使用p:属性名进行设值注入

在bean元素中加入p:属性名="属性值"这个格式的属性即可直接对属性执行设值注入。如果在属性名后增加了"-ref"后缀,则指定该值不是一个具体的值,而是对另外一个Bean的引用。

使用p:命名空间时Bean内的属性名不要以-ref结尾

使用p:命名空间没有标准的XML格式灵活,如果某个Bean的属性名是以-ref结尾的,那么采用p:命名空间定义时就会发生冲突,而采用标准的XML格式定义则不会出现这种问题。