美文网首页
Spring框架的两个简化XML配置文件的p-namespace

Spring框架的两个简化XML配置文件的p-namespace

作者: huapro | 来源:发表于2019-06-02 20:46 被阅读0次

    Spring框架的模块化设计,出现了大量的命名空间。应用开发过程中用到的模块,才需要引入对应的命名空间。

    Spring框架的丰富功能,导致了Spring框架的XML配置文件十分复杂。这里要介绍的是两个特殊的命名空间,其出现只是为了简化XML配置文件的编写,并未提供应用所需的逻辑功能。

    1. p-namespace
      在XML配置文件中,首先引入如下命名空间:
      xmlns:p="http://www.springframework.org/schema/p"
      然后,在对应的<bean>中,使用p:属性(具体名称可定制),而非子元素<property>,以配置其所依赖的其他Spring Bean
      示例如下:

    <bean name="my_classicBean" class="com.example.ExampleBean">
    <property name="email" value="foo@bar.com"/>
    </bean>

    等价于:
    <bean name="my_p-namespaceBean" class="com.example.ExampleBean" p:email="foo@bar.com"/>
    注意对比上述示例,特别是p:email属性的用法。

    1. c-namespace(Spring 3.1及以后出现)
      在XML配置文件中,首先引入如下命名空间:
      xmlns:c="http://www.springframework.org/schema/c"
      然后,在对应的<bean>中,以<bean>的c:属性(具体名称可定制),而非子元素<constructor-arg>,配置其所依赖的其他Spring Bean
      示例如下:
      <bean id="bar" class="x.y.Bar"/>
      <bean id="baz" class="x.y.Baz"/>
      <bean id="foo" class="x.y.Foo">
      <constructor-arg ref="bar"/>
      <constructor-arg ref="baz"/>
      <constructor-arg value="foo@bar.com"/>
      </bean>

      等价于:

    <bean id="bar" class="x.y.Bar"/>
    <bean id="baz" class="x.y.Baz"/>
    <bean id="foo" class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz" c:email="foo@bar.com"/>

    注意对比上述示例,特别是c:bar-ref, c:baz-ref和c:emial属性的用法。

    4p命名空间和c命名空间

    在通过构造方法或set方法给bean注入关联项时通常是通过constructor-arg元素和property元素来定义的。在有了p命名空间和c命名空间时我们可以简单的把它们当做bean的一个属性来进行定义。

    4.1p命名空间

    使用p命名空间时需要先声明使用对应的命名空间,即在beans元素上加入xmlns:p="http://www.springframework.org/schema/p"。下面先来看一个示例。

    <?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:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="world" class="com.app.World"/>
    
        <!-- 通过set方法注入的传统的bean定义 -->
        <bean id="hello1" class="com.app.Hello">
            <property name="p1" value="v1"/>
            <property name="p2" value="v2"/>
            <property name="world" ref="world"/>
        </bean>
    
        <!-- 通过set方法注入的使用p命名空间的bean定义 -->
        <bean id="hello2" class="com.app.Hello" p:p1="v1" p:p2="v2" p:world-ref="world"/>
    
    </beans>
    

    在上面示例中,idhello1bean是传统的bean定义,而idhello2bean是基于p命名空间的bean定义。当传统的property元素定义的value是基础数据类型时,我们可以直接把property元素对应的name加上p命名空间的前缀作为bean的一个属性进行定义,对应的值就是原property元素对应的value。如上述示例中name“p1”property使用p命名空间后就变成了“p:p1”;当传统的property元素定义的是对其它bean的关联时,我们可以直接把property元素对应的name加上“-ref”,再加上p命名空间的前缀作为bean的一个属性进行定义,对应的值为原property元素对应的ref值,如上述示例中name“world”property就是定义了对其它bean的关联,使用p命名空间后就变成了“p:world-ref”。这里有一点需要注意的地方就是property对应的是set方法,而不是对应的属性,如name“world”property实际上对应的是setWorld()方法,这个时候不管对应的bean是否真存在名为world的属性;另一点需要注意的地方是使用p命名空间时要注意以“-ref”结尾的property,这会导致Spring以其前部分作为property,因为“-ref”会被Spring作为关联的关键字。

    4.2c命名空间

    c命名空间的用法和p命名空间类似,其对应于constructor-arg,即可以将constructor-arg元素替换为bean的一个以c命名空间前缀开始的属性。使用c命名空间之前也需要通过xmlns:c=”http://www.springframework.org/schema/c”进行声明。

    <?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:c="http://www.springframework.org/schema/c"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="world" class="com.app.World"/>
    
        <!-- 传统的使用constructor-arg通过构造方法注入的bean定义 -->
        <bean id="hello1" class="com.app.Hello">
            <constructor-arg index="0" value="arg1"/>
            <constructor-arg index="1" value="2"/><!-- arg2 -->
            <constructor-arg index="2" ref="world"/><!-- arg3 -->
        </bean>
        <!-- 使用c命名空间通过构造方法注入的bean定义 -->
        <bean id="hello2" class="com.app.Hello" c:arg1="c_arg1" c:arg2="2" c:arg3-ref="world"/>
    </beans>
    

    如上所示,c命名空间的用法和p命名空间的用法类似。对于通过构造方法注入原始类型的对象可以把对应的构造参数名称加上c命名空间的前缀作为bean的一个属性进行定义,对应的值即是构造参数的值;如果通过构造参数注入的是其它bean的一个引用,则可将该构造参数名称加上“-ref”,再加上c命名空间的前缀作为该bean的一个属性进行定义,对应的值为所关联beanidname,如上述示例中的“c:arg3-ref”

    需要注意的是直接把构造参数名称加上c命名空间的前缀作为bean的一个属性定义来替代对应的constructor-arg只对以debug方式编译的class有效,因为对于非debug方式编译的class文件Spring将无法获取到对应构造方法的参数名。对于这种情况我们可以直接使用构造方法参数的索引加上下划线“_”前缀来代替对应的参数名,索引是从0开始的,如上面的示例以索引来代替时将是如下这个样子。

    <?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:c="http://www.springframework.org/schema/c"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="world" class="com.app.World"/>
    
        <!-- 传统的使用constructor-arg通过构造方法注入的bean定义 -->
        <bean id="hello1" class="com.app.Hello">
            <constructor-arg index="0" value="arg1"/>
            <constructor-arg index="1" value="2"/><!-- arg2 -->
            <constructor-arg index="2" ref="world"/><!-- arg3 -->
        </bean>
        <!-- 使用c命名空间并且是使用构造参数的索引作为属性来通过构造方法注入的bean定义 -->
        <bean id="hello2" class="com.app.Hello" c:_0="c_arg1" c:_1="2" c:_2-ref="world"/>
    </beans>
    

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

    原文:https://blog.csdn.net/taiyangdao/article/details/50989307
    版权声明:本文为博主原创文章,转载请附上博文链接!

    相关文章

      网友评论

          本文标题:Spring框架的两个简化XML配置文件的p-namespace

          本文链接:https://www.haomeiwen.com/subject/vblfxctx.html