Spring(04)——p命名空间和c命名空间

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

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所写)

 

目录
相关文章
|
7月前
|
XML Java 数据格式
Spring5源码(17)-Spring解析xml默认命名空间
Spring5源码(17)-Spring解析xml默认命名空间
45 0
|
7月前
|
XML Java 数据格式
Spring【p命名和c命名空间注入】
Spring【p命名和c命名空间注入】
|
Java Spring
Spring-注入参数详解-[通过util命名空间简化集合类型的配置]
Spring-注入参数详解-[通过util命名空间简化集合类型的配置]
125 0
QGS
浅谈Spring6之P和C命名空间注入的区别
基于P命名空间注入 P命名空间注入是简化构造方法的注入 使用P命名空间注入的两个条件 一:xmlns:p="http://www.springframework.org/schema/p" 二:提供set方法
QGS
74 0
|
Java Spring 容器
Spring(27)——util命名空间
Spring之util命名空间 util命名空间可以帮助我们快速的定义list、map、set等。如果要使用它,我们首先需要在XML配置文件中引入其对应的namespace。 定义Properties 可以通过util:properties快速的定义一个Properties对象,可以通过其子元素来定义一个Properties的元素,key对应属性名,而元素中间的文本值则为对应的属性值。
2085 0
|
XML 前端开发 Java
|
XML Java 数据格式
源码分析ElasticJob前置篇之自定义Spring命名空间
源码分析ElasticJob前置篇之自定义Spring命名空间
源码分析ElasticJob前置篇之自定义Spring命名空间
|
XML Java 数据格式
源码分析Elastic-Job前置篇:Spring自定义命名空间原理
在 Spring 中使用 Elastic-Job 的示例如下:
1626 0
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
223 2
下一篇
DataWorks