当前位置: 首页 > article >正文

《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。


http://www.kler.cn/a/488540.html

相关文章:

  • Linux之线程池与单例模式
  • C++ 多线程异步操作
  • 多目标优化算法之一:基于分解的方法
  • xml简介
  • 国产信创实践(国能磐石服务器操作系统CEOS +东方通TongHttpServer)
  • 力扣刷题:二叉树OJ篇(上)
  • PHP语言的学习路线
  • nexus搭建maven私服
  • CI/CD 流水线
  • css小知识:如何使用字体包
  • 高通,联发科(MTK)等手机平台调优汇总
  • QT转到槽报错The class containing “Ui::MainWindow“ could not be found in...
  • 二、智能体强化学习——深度强化学习核心算法
  • 银河麒麟编译QXlsx,使用Qt5.14.2
  • C++并发编程之基于锁的数据结构的适用场合与需要考虑和注意的问题
  • 【深度学习】核心概念-特征学习(Feature Learning)
  • Apifox=Postman+Swagger+Jmeter+Mock
  • 文生图模型的技术原理、训练方案与微调方案
  • js实现md5加密
  • 【GO】GORM 使用教程
  • Oracle SQL优化过程一则以及group by少见用法报错点
  • unity adb 连不上安卓手机?
  • Vue 开发者的 React 实战指南:状态管理篇
  • 大语言模型是如何训练出来的?
  • axios的基本使用
  • 微信小程序实现拖拽盒子效果