命名空间允许您使用 bean 元素的属性(而不是嵌套的标签元素)来描述协作 Bean 的属性值,或同时使用这两者。

你可以将其视为一种对 <property/><constructor-arg/> 标签的简写方式,不同之处在于,使用命名空间需要先引入对应的 XML 约束

(1) p 名称空间xmlns:p="http://www.springframework.org/schema/p"

(2) c 名称空间**:xmlns:c="http://www.springframework.org/schema/c"

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"(1)
  5. xmlns:c="http://www.springframework.org/schema/c"(2)
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. https://www.springframework.org/schema/beans/spring-beans.xsd">
  8. <!-- xml内容 -->
  9. </beans>

一、具有 p 名称空间的 XML 快捷方式


相关链接**:Spring Framework 中文文档 - p命名空间

1.1 普通注入

原来的注入方式:

<bean name="classic" class="com.example.ExampleBean">
    <property name="email" value="[emailprotected]"/>
</bean>

p名称空间的注入方式:

<bean name="p-namespace" class="com.example.ExampleBean" p:email="[emailprotected]"/>

1.2 引用注入

被引用的 bean:

<bean name="jane" class="com.example.Person">
    <property name="name" value="Jane Doe"/>
</bean>

原来的注入方式:

<bean name="john-classic" class="com.example.Person">
    <property name="name" value="John Doe"/>
    <property name="spouse" ref="jane"/>
</bean>

p名称空间的注入方式:

<bean name="john-modern" class="com.example.Person" 
      p:name="John Doe" 
      p:spouse-ref="jane"/>

二、具有 c-namespace 的 XML 快捷方式

相关链接Spring Framework 中文文档 - c命名空间

2.1 普通注入

原来的注入方式:

<bean id="thingOne" class="x.y.ThingOne">
    <constructor-arg value="[emailprotected]"/>
</bean>

c名称空间的注入方式:

<bean id="thingOne" class="x.y.ThingOne" c:email="[emailprotected]"/>

1.2 引用注入

被引用的 bean:

<bean id="thingOne" class="x.y.ThingTwo"/>
<bean id="thingTwo" class="x.y.ThingThree"/>

原来的注入方式:

<bean id="thingOne" class="x.y.ThingOne">
    <constructor-arg ref="thingTwo"/>
    <constructor-arg ref="thingThree"/>
</bean>

c名称空间的注入方式:

<bean id="thingOne" class="x.y.ThingOne" 
      c:thingTwo-ref="thingTwo" 
      c:thingThree-ref="thingThree"/>

注:由于 XML 语法的原因,索引符号要求前导 _ 的存在,因为 XML 属性名称不能以数字开头(即使某些 IDE 允许)。

三、复合属性名称(嵌套属性名称)

相关链接Spring Framework 中文文档 - 复合属性名称

设置 bean 属性时,可以使用复合属性名称或嵌套属性名称,只要路径中除最终属性名称之外的所有组件都不是null即可。考虑以下 bean 定义:

<bean id="something" class="things.ThingOne">
    <property name="fred.bob.sammy" value="123" />
</bean>

something bean 具有 fred 属性,该属性具有 bob 属性,该属性具有 sammy 属性,并且最终的 sammy 属性被设置为的 123 值。为了使它起作用,在构造 bean 之后,something 的 ``fred 属性和 fred 的 ``bob 属性一定不能为 null 。否则,将抛出 NullPointerException