命名空间允许您使用
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"
<?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"(1)
xmlns:c="http://www.springframework.org/schema/c"(2)
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- xml内容 -->
</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
。