`
234390216
  • 浏览: 10233707 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462670
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775578
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398404
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395035
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:680008
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:530913
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1184077
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:468008
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151411
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68174
社区版块
存档分类
最新评论

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所写)

0
0
分享到:
评论

相关推荐

    Spring——DI和通过注解实现IOC和DI

    【Spring——DI和通过注解实现IOC和DI】 在软件设计中,依赖注入(Dependency Injection,简称DI)是一种设计模式,用于减少代码间的耦合,提高应用的可测试性和可维护性。DI的核心思想是,组件之间的依赖关系不再...

    spring-beans-3.0.xsd

    除此之外,`&lt;util&gt;`命名空间在3.1版本中得到加强,提供了对map、list、set等集合类型的便利配置方式,如`&lt;util:list&gt;`、`&lt;util:map&gt;`等,使得集合注入更加直观。 总的来说,`spring-beans-3.1.xsd`相对于`spring-...

    Spring3_权威开发指南

    - **&lt;util/&gt;命名空间**:介绍了Spring提供的`&lt;util/&gt;`命名空间,用于简化常用类型的配置。 - **值得重视的若干DI特性**: - **depends-on属性**:允许指定Bean依赖于其他Bean。 - **别名(Alias)**:为Bean创建...

    J2EE开发全程实录

    - **空间与时间的权衡**:深入探讨了程序性能优化中的两个核心概念——时间和空间,以及如何在二者之间做出合理的平衡。例如,有时候可以通过增加内存消耗来减少程序执行时间。 - **哈希表与Map接口**:介绍了哈希表...

    jdk-8u66-linux-x64源代码

    5. **org**: 这个包通常用于开源项目或组织,如`org.w3c`(W3C标准)或`org.springframework`(Spring框架)。在JDK源代码中,可能包含Oracle公司的某些特定组件。 通过分析这些源代码,开发者可以学习到Java语言的...

    bai1

    4. **包(Package)**:用于组织类,提供命名空间避免类名冲突,如`java.util`,`java.io`等。 5. **接口(Interface)**:Java的接口是完全抽象的,用于定义多个类共同遵循的行为规范。 6. **异常处理**:Java...

    诅咒

    类被组织在包中,这是Java命名空间的一部分,有助于管理类的导入和避免命名冲突。例如,`java.util` 包含许多实用工具类,如集合框架、日期/时间API等。 在Java中,面向对象编程(OOP)是核心概念。它包括封装、...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    然后,打开 Flex Builder 3,创建一个新的 Flex Project,命名为 EmployeeMgmt-Flex: 图 3. 新建 Flex 工程 - 第一步 Flex Project 需要指定 Server 端的配置文件地址: 图 4. 新建 Flex 工程 - 第二步 ...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    然后,打开 Flex Builder 3,创建一个新的 Flex Project,命名为 EmployeeMgmt-Flex: 图 3. 新建 Flex 工程 - 第一步 Flex Project 需要指定 Server 端的配置文件地址: 图 4. 新建 Flex 工程 - 第二步 ...

Global site tag (gtag.js) - Google Analytics