util命名空间可以帮助我们快速的定义list、map、set等。如果要使用它,我们首先需要在XML配置文件中引入其对应的namespace。
可以通过<code>util:properties</code>快速的定义一个Properties对象,可以通过其子元素<code><prop key=""></prop></code>来定义一个Properties的元素,key对应属性名,而<code><prop></code>元素中间的文本值则为对应的属性值。比如我们就定义了一个id为utilProperties,类型为java.util.Properties类型的bean,其拥有两个键值对,分别是<code>a=a</code>和<code>b=b</code>。
<code>util:properties</code>的内容也可以来自一个外部文件,此时可以通过location属性引用对应的外部文件。如下就引入了类路径下的一个util.properties文件作为定义的Properties的内容的一部分,此时使用子元素prop指定的键值对也同样生效。
当通过location指定的外部文件和通过子元素prop指定的键值对中拥有相同的Key时,默认通过location指定的文件中定义的键值对拥有更高的优先级。比如上面的配置中如果util.properties中定义了<code>b=c</code>,则最终从该bean中获取的Key为b的值将是文件中定义的<code>c</code>。如果需要通过子元素prop指定的键值对拥有更高的优先级,则可以通过<code>local-override="true"</code>来控制,默认该属性值是false。所以如果配置是下面这样时,对于刚才的示例,获取的Key为b的值仍然是<code>b</code>。
通过location属性指定的本地文件也可以是多个,多个文件之间可以通过英文的逗号分隔。下面的示例就同时指定了类路径下的util.properties和application.properties文件。
通过location属性指定了本地文件后,如果对应的资源文件不存在,默认是会抛出异常的。可以通过指定<code>ignore-resource-not-found="true"</code>来忽略文件不存在的场景。
下面的UtilNamespaceBean拥有一个Properties类型的属性properties,在不使用<code>util:properties</code>时,我们在注入Properties时需要如下这样进行。
有了<code>util:properties</code>时可以这样做:
虽然这看起来也没有多简单,但是它的好处就是可以引用外部的文件。
可以通过<code>util:list</code>来定义一个<code>java.util.List</code>类型的bean,其子元素就是对应的List的元素,其子元素可以是一切可以用来定义对象的元素,比如value、bean等。以下代码就简单的通过value子元素定义两个元素1和2。虽然它们的文本看上去是数字类型的,但是如果把它们取出来你会发现它们的类型其实是<code>java.lang.String</code>。
如果想让他们的类型是数字类型,则可以通过<code>value-type</code>属性指定元素值的类型,需要是数字类型则指定<code>value-type="java.lang.Integer"</code>。
<code>util:list</code>默认生成的是<code>java.util.ArrayList</code>类型的List,如果需要使用其它类型的List,则可以通过<code>list-class</code>来指定。比如下面就指定了生成的List是<code>java.util.LinkedList</code>。
如果是需要注入给某个bean,在不使用<code>util:list</code>时我们是通过list元素来定义list的,比如下面这样:
可以通过<code>util:set</code>来定义一个<code>java.util.Set</code>类型的bean。它的用法和<code>util:list</code>是类似的。通过value子元素指定的值默认也是<code>java.lang.String</code>类型,可以通过<code>value-type</code>属性来指定元素类型。
默认生成的Set是<code>java.util.LinkedHashSet</code>类型,可以通过<code>set-class</code>属性来指定生成的Set的类型。
如果需要注入Set类型的属性,在不使用<code>util:set</code>时是通过set元素来定义的,比如下面这样:
可以通过<code>util:map</code>来定义一个Map类型的bean,Map中的每一个Entry则由其子元素entry来定义。每个Entry的key和value可以通过entry元素的key和value属性来定义,比如下面的第一个entry;key也可以通过<code>key-ref</code>来引用bean容器中的一个bean,比如下面的第二个entry;value属性指定的默认是<code>java.lang.String</code>类型,如果需要解析为其它类型,可以通过<code>value-type</code>属性指定value的类型;value也可以通过<code>value-ref</code>来引用bean容器中的一个bean,比如下面的第三个entry;每个Entry的key和value也可以通过entry的子元素来表示,比如下面的第四和第五个entry。子元素下面的key用来指定Entry的key,如果是普通的key可以通过value子元素来表示,比如下面的第四个entry,如果是bean则可以通过bean子元素来定义,或者通过ref子元素来引用一个bean。value如果是普通的Value则可以直接通过entry的子元素value来定义,否则可以使用bean、ref这样的子元素来表示一个对象。
如果需要注入Map类型的属性,在不使用<code>util:map</code>时是通过map元素来定义的,比如下面这样:
<code>util:constant</code>可以把一个常量定义为bean容器中的一个bean,可以通过id属性指定对应的bean的id。<code>static-field</code>用来指定引用的static变量,需要是public类型的。
<code>util:property-path</code>可以用来把某个bean的某个属性的值定义为一个bean,属性值是可以级联的,比如<code>a.b.c</code>就表示名为a的bean的b属性的c属性的值,获取具体的属性时都是通过get方法获取的,所以<code>a.b.c</code>就相当于<code>a.getB().getC()</code>。id属性用于指定生成的bean的id。<code>util:property-path</code>用于一个bean的某个属性需要依赖于另一个bean的某个属性的场景。
(注:本文是基于Spring4.1.0所写)