Spring(27)——util命名空间

Spring之util命名空间

util命名空间可以帮助我们快速的定义list、map、set等。如果要使用它,我们首先需要在XML配置文件中引入其对应的namespace。

<?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:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
     http://www.springframework.org/schema/util
     http://www.springframework.org/schema/util/spring-util-4.1.xsd">

</beans>

定义Properties

可以通过util:properties快速的定义一个Properties对象,可以通过其子元素<prop key=""></prop>来定义一个Properties的元素,key对应属性名,而<prop>元素中间的文本值则为对应的属性值。比如我们就定义了一个id为utilProperties,类型为java.util.Properties类型的bean,其拥有两个键值对,分别是a=ab=b

<util:properties id="utilProperties">
    <prop key="a">a</prop>
    <prop key="b">b</prop>
</util:properties>

util:properties的内容也可以来自一个外部文件,此时可以通过location属性引用对应的外部文件。如下就引入了类路径下的一个util.properties文件作为定义的Properties的内容的一部分,此时使用子元素prop指定的键值对也同样生效。

<util:properties id="utilProperties" location="classpath:util.properties">
    <prop key="a">a</prop>
    <prop key="b">b</prop>
</util:properties>

当通过location指定的外部文件和通过子元素prop指定的键值对中拥有相同的Key时,默认通过location指定的文件中定义的键值对拥有更高的优先级。比如上面的配置中如果util.properties中定义了b=c,则最终从该bean中获取的Key为b的值将是文件中定义的c。如果需要通过子元素prop指定的键值对拥有更高的优先级,则可以通过local-override="true"来控制,默认该属性值是false。所以如果配置是下面这样时,对于刚才的示例,获取的Key为b的值仍然是b

<util:properties id="utilProperties" location="classpath:util.properties" 
local-override="true">
    <prop key="a">a</prop>
    <prop key="b">b</prop>
</util:properties>

通过location属性指定的本地文件也可以是多个,多个文件之间可以通过英文的逗号分隔。下面的示例就同时指定了类路径下的util.properties和application.properties文件。

<util:properties id="utilProperties" 
location="classpath:util.properties,classpath:application.properties" 
local-override="true">
    <prop key="a">a</prop>
    <prop key="b">b</prop>
</util:properties>

通过location属性指定了本地文件后,如果对应的资源文件不存在,默认是会抛出异常的。可以通过指定ignore-resource-not-found="true"来忽略文件不存在的场景。

<util:properties id="utilProperties" 
location="classpath:util.properties,classpath:application.properties" 
    local-override="true" ignore-resource-not-found="true">
    <prop key="a">a</prop>
    <prop key="b">b</prop>
</util:properties>

下面的UtilNamespaceBean拥有一个Properties类型的属性properties,在不使用util:properties时,我们在注入Properties时需要如下这样进行。

<bean class="com.elim.spring.bean.UtilNamespaceBean">
    <property name="properties">
        <props>
            <prop key="a">a</prop>
            <prop key="b">b</prop>
        </props>
    </property>
</bean>

有了util:properties时可以这样做:

<bean class="com.elim.spring.bean.UtilNamespaceBean">
    <property name="properties">
        <util:properties>
            <prop key="a">a</prop>
            <prop key="b">b</prop>
        </util:properties>
    </property>
</bean>

虽然这看起来也没有多简单,但是它的好处就是可以引用外部的文件。

<bean class="com.elim.learn.spring.bean.UtilNamespaceBean">
    <property name="properties">
        <util:properties location="classpath:util.properties">
            <prop key="a">a</prop>
            <prop key="b">b</prop>
        </util:properties>
    </property>
</bean>

定义java.util.List

可以通过util:list来定义一个java.util.List类型的bean,其子元素就是对应的List的元素,其子元素可以是一切可以用来定义对象的元素,比如value、bean等。以下代码就简单的通过value子元素定义两个元素1和2。虽然它们的文本看上去是数字类型的,但是如果把它们取出来你会发现它们的类型其实是java.lang.String

<util:list id="utilList">
    <value>1</value>
    <value>2</value>
</util:list>

如果想让他们的类型是数字类型,则可以通过value-type属性指定元素值的类型,需要是数字类型则指定value-type="java.lang.Integer"

<util:list id="utilList" value-type="java.lang.Integer">
    <value>1</value>
    <value>2</value>
</util:list>

util:list默认生成的是java.util.ArrayList类型的List,如果需要使用其它类型的List,则可以通过list-class来指定。比如下面就指定了生成的List是java.util.LinkedList

<util:list id="utilList" value-type="java.lang.Integer" 
list-class="java.util.LinkedList">
    <value>1</value>
    <value>2</value>
</util:list>

如果是需要注入给某个bean,在不使用util:list时我们是通过list元素来定义list的,比如下面这样:

<bean class="com.elim.spring.bean.UtilNamespaceBean">
    <property name="list">
        <list>
            <value>1</value>
            <value>2</value>
        </list>
    </property>
</bean>

定义java.util.Set

可以通过util:set来定义一个java.util.Set类型的bean。它的用法和util:list是类似的。通过value子元素指定的值默认也是java.lang.String类型,可以通过value-type属性来指定元素类型。

<util:set id="utilSet" value-type="java.lang.Integer">
    <value>1</value>
    <value>2</value>
</util:set>

默认生成的Set是java.util.LinkedHashSet类型,可以通过set-class属性来指定生成的Set的类型。

<util:set id="utilSet" value-type="java.lang.Integer" set-class="java.util.HashSet">
    <value>1</value>
    <value>2</value>
</util:set>

如果需要注入Set类型的属性,在不使用util:set时是通过set元素来定义的,比如下面这样:

<bean class="com.elim.spring.bean.UtilNamespaceBean">
    <property name="set">
        <set>
            <value>1</value>
            <value>2</value>
        </set>
    </property>
</bean>

定义java.util.Map

可以通过util:map来定义一个Map类型的bean,Map中的每一个Entry则由其子元素entry来定义。每个Entry的key和value可以通过entry元素的key和value属性来定义,比如下面的第一个entry;key也可以通过key-ref来引用bean容器中的一个bean,比如下面的第二个entry;value属性指定的默认是java.lang.String类型,如果需要解析为其它类型,可以通过value-type属性指定value的类型;value也可以通过value-ref来引用bean容器中的一个bean,比如下面的第三个entry;每个Entry的key和value也可以通过entry的子元素来表示,比如下面的第四和第五个entry。子元素下面的key用来指定Entry的key,如果是普通的key可以通过value子元素来表示,比如下面的第四个entry,如果是bean则可以通过bean子元素来定义,或者通过ref子元素来引用一个bean。value如果是普通的Value则可以直接通过entry的子元素value来定义,否则可以使用bean、ref这样的子元素来表示一个对象。

<util:map id="utilMap">
    <entry key="a" value="1"/>
    <entry key-ref="utilList" value="2" value-type="java.lang.Integer"/>
    <entry key="utilSet" value-ref="utilSet"/>
    <entry>
        <key>
            <value>b</value>
        </key>
        <value>2</value>
    </entry>
    <entry>
        <key>
            <ref bean="utilSet"/>
        </key>
        <ref bean="utilList"/>
    </entry>
</util:map>

如果需要注入Map类型的属性,在不使用util:map时是通过map元素来定义的,比如下面这样:

<bean class="com.elim.spring.bean.UtilNamespaceBean">
    <property name="map">
        <map>
            <entry>
                <key>
                    <value>a</value>
                </key>
                <value>1</value>
            </entry>
            <entry key="b" value="2"/>
            <entry key="c" value="3"/>
        </map>
    </property>
</bean>

把常量值作为bean定义

util:constant可以把一个常量定义为bean容器中的一个bean,可以通过id属性指定对应的bean的id。static-field用来指定引用的static变量,需要是public类型的。

<util:constant static-field="com.elim.spring.Constant.ABC" id="abc"/>

把bean的属性作为bean开放

util:property-path可以用来把某个bean的某个属性的值定义为一个bean,属性值是可以级联的,比如a.b.c就表示名为a的bean的b属性的c属性的值,获取具体的属性时都是通过get方法获取的,所以a.b.c就相当于a.getB().getC()。id属性用于指定生成的bean的id。util:property-path用于一个bean的某个属性需要依赖于另一个bean的某个属性的场景。

<util:property-path path="utilNamespaceBean.abc" id="beanABC"/>

(注:本文是基于Spring4.1.0所写)

上一篇:快速构建Windows 8风格应用22-MessageDialog


下一篇:SpringMVC路径匹配中使用通配符