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=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>
定义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所写)
相关推荐
【Spring——DI和通过注解实现IOC和DI】 在软件设计中,依赖注入(Dependency Injection,简称DI)是一种设计模式,用于减少代码间的耦合,提高应用的可测试性和可维护性。DI的核心思想是,组件之间的依赖关系不再...
除此之外,`<util>`命名空间在3.1版本中得到加强,提供了对map、list、set等集合类型的便利配置方式,如`<util:list>`、`<util:map>`等,使得集合注入更加直观。 总的来说,`spring-beans-3.1.xsd`相对于`spring-...
- **<util/>命名空间**:介绍了Spring提供的`<util/>`命名空间,用于简化常用类型的配置。 - **值得重视的若干DI特性**: - **depends-on属性**:允许指定Bean依赖于其他Bean。 - **别名(Alias)**:为Bean创建...
- **空间与时间的权衡**:深入探讨了程序性能优化中的两个核心概念——时间和空间,以及如何在二者之间做出合理的平衡。例如,有时候可以通过增加内存消耗来减少程序执行时间。 - **哈希表与Map接口**:介绍了哈希表...
5. **org**: 这个包通常用于开源项目或组织,如`org.w3c`(W3C标准)或`org.springframework`(Spring框架)。在JDK源代码中,可能包含Oracle公司的某些特定组件。 通过分析这些源代码,开发者可以学习到Java语言的...
4. **包(Package)**:用于组织类,提供命名空间避免类名冲突,如`java.util`,`java.io`等。 5. **接口(Interface)**:Java的接口是完全抽象的,用于定义多个类共同遵循的行为规范。 6. **异常处理**:Java...
类被组织在包中,这是Java命名空间的一部分,有助于管理类的导入和避免命名冲突。例如,`java.util` 包含许多实用工具类,如集合框架、日期/时间API等。 在Java中,面向对象编程(OOP)是核心概念。它包括封装、...
然后,打开 Flex Builder 3,创建一个新的 Flex Project,命名为 EmployeeMgmt-Flex: 图 3. 新建 Flex 工程 - 第一步 Flex Project 需要指定 Server 端的配置文件地址: 图 4. 新建 Flex 工程 - 第二步 ...
然后,打开 Flex Builder 3,创建一个新的 Flex Project,命名为 EmployeeMgmt-Flex: 图 3. 新建 Flex 工程 - 第一步 Flex Project 需要指定 Server 端的配置文件地址: 图 4. 新建 Flex 工程 - 第二步 ...