用来记录一些原创性的总结
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>
可以通过util:properties
快速的定义一个Properties对象,可以通过其子元素<prop key=""></prop>
来定义一个Properties的元素,key对应属性名,而<prop>
元素中间的文本值则为对应的属性值。比如我们就定义了一个id为utilProperties,类型为java.util.Properties类型的bean,其拥有两个键值对,分别是a=a
和b=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>
可以通过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>
可以通过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>
可以通过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>
util:constant
可以把一个常量定义为bean容器中的一个bean,可以通过id属性指定对应的bean的id。static-field
用来指定引用的static变量,需要是public类型的。
<util:constant static-field="com.elim.spring.Constant.ABC" id="abc"/>
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所写)