《Spring Framework实战》11:4.1.4.2.详细的依赖和配置2

欢迎观看《Spring Framework实战》视频教程
          1. 空字符串值

Spring将属性等的空参数视为空字符串。以下基于XML的配置元数据片段将电子邮件属性设置为空字符串值("")。

<bean class="ExampleBean">

<property name="email" value=""/>

</bean>

前面的示例等效于以下Java代码:

Java

exampleBean.setEmail("");

<null/>元素处理空值。以下列表显示了一个示例:

<bean class="ExampleBean">

<property name="email">

<null/>

</property>

</bean>

上述配置等效于以下Java代码:

Java

exampleBean.setEmail(null);

          1. 带有p-namespace的XML快捷方式

p-namespace允许您使用bean元素的属性(而不是嵌套的<property/>元素)来描述协作bean的属性值,或两者兼而有之。

Spring支持基于XML模式定义的命名空间的可扩展配置格式。本章讨论的bean配置格式在XML模式文档中定义。但是,p-namespace没有在XSD文件中定义,只存在于Spring的核心中。

以下示例显示了解析为相同结果的两个XML片段(第一个使用标准XML格式,第二个使用p-namespace):

<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

https://www.springframework.org/schema/beans/spring-beans.xsd">

<bean name="classic" class="com.example.ExampleBean">

<property name="email" value="someone@somewhere.com"/>

</bean>

<bean name="p-namespace" class="com.example.ExampleBean"

p:email="someone@somewhere.com"/>

</beans>

该示例显示了bean定义中p-namespace中名为email的属性。这个命令告诉Spring包含一个属性声明。如前所述,p-namespace没有模式定义,因此您可以将属性的名称设置为属性名称。

下一个例子包括另外两个bean定义,它们都引用了另一个bean:

<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

https://www.springframework.org/schema/beans/spring-beans.xsd">

<bean name="john-classic" class="com.example.Person">

<property name="name" value="John Doe"/>

<property name="spouse" ref="jane"/>

</bean>

<bean name="john-modern"

class="com.example.Person"

p:name="John Doe"

p:spouse-ref="jane"/>

<bean name="jane" class="com.example.Person">

<property name="name" value="Jane Doe"/>

</bean>

</beans>

此示例不仅包括使用p-namespace的属性值,还使用特殊格式声明属性引用。第一个bean定义使用<property name="spouse"ref="jane"/>创建从bean john到bean jane的引用,而第二个bean定义则使用p:spouse ref="jane"作为属性来执行完全相同的操作。在这种情况下,配偶是属性名,而-ref部分表示这不是一个直接的值,而是对另一个bean的引用。

p-namespace不如标准XML格式灵活。例如,声明属性引用的格式与以Ref结尾的属性冲突,而标准XML格式则不冲突。我们建议您仔细选择您的方法,并将其传达给您的团队成员,以避免同时生成使用所有三种方法的XML文档。

          1. 带有c-namespace的XML快捷方式

与具有p-namespace的XML快捷方式类似,Spring 3.1中引入的c-namespace允许内联属性来配置构造函数参数,而不是嵌套构造函数参数元素。

以下示例使用c:namespace执行与基于构造函数的依赖注入相同的操作:

<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

https://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="beanTwo" class="x.y.ThingTwo"/>

<bean id="beanThree" class="x.y.ThingThree"/>

<!-- traditional declaration with optional argument names -->

<bean id="beanOne" class="x.y.ThingOne">

<constructor-arg name="thingTwo" ref="beanTwo"/>

<constructor-arg name="thingThree" ref="beanThree"/>

<constructor-arg name="email" value="something@somewhere.com"/>

</bean>

<!-- c-namespace declaration with argument names -->

<bean id="beanOne"

class="x.y.ThingOne"

c:thingTwo-ref="beanTwo"

c:thingThree-ref="beanThree"

c:email="something@somewhere.com"/>

</beans>

c:namespace使用与p:one(bean引用的尾随-ref)相同的约定,按名称设置构造函数参数。同样,它需要在XML文件中声明,即使它没有在XSD模式中定义(它存在于Spring核心中)。

对于构造函数参数名称不可用的罕见情况(通常是在编译字节码时没有-parameters标志的情况下),您可以回退到参数索引,如下所示:

<!-- c-namespace index declaration -->

<bean id="beanOne" class="x.y.ThingOne" c:_0-ref="beanTwo" c:_1-ref="beanThree"

c:_2="something@somewhere.com"/>

|---|--------------------------------------------------------------------------------------------------------------|
| | 由于XML语法,索引表示法需要前导_的存在,因为XML属性名称不能以数字开头(即使某些IDE允许这样做)。相应的索引符号也可用于<constructor arg>元素,但并不常用,因为声明的简单顺序通常就足够了。 |

在实践中,构造函数解析机制在匹配参数方面非常有效,因此除非您真的需要,否则我们建议在整个配置中使用名称表示法。

          1. 复合属性名称

设置bean属性时,可以使用复合或嵌套属性名,只要路径中除最终属性名之外的所有组件都不为空。考虑以下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。

相关推荐
蒜蓉大猩猩1 小时前
Node.js - 模块化与包管理工具
后端·架构·node.js
五行星辰1 小时前
Servlet与JSP:Java的秘密花园入口
java·开发语言·servlet
代码驿站5201 小时前
Scala语言的软件工程
开发语言·后端·golang
Code花园2 小时前
Objective-C语言的多线程编程
开发语言·后端·golang
Q_27437851092 小时前
django基于 Python 的考研学习系统的设计与实现
java·python·考研·django
Yang-Never2 小时前
Shader -> SweepGradient扫描渐变着色器详解
android·java·kotlin·android studio·着色器
我想学LINUX2 小时前
【2024年华为OD机试】 (C卷,100分)- 消消乐游戏(Java & JS & Python&C/C++)
java·c语言·javascript·c++·游戏·华为od
葡萄架子2 小时前
线程安全问题介绍
java·jvm·安全
Q_27437851092 小时前
django基于Python的校园个人闲置物品换购平台
java·数据库·python·django
牛马baby2 小时前
Java高频面试之SE-11
java·python·面试