在Spring中定义bean的方式多种多样,即使使用xml的方式来配置也能派生出很多不同的方式。
比如如下的bean定义:
1
2
3
4
5
6
7
8
9
10
11
12
|
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="person" class="Person">
<property name="name" value="Tom"/>
<property name="age" value="20"/>
</bean>
</beans>
|
这样的bean有三行,通过使用p-namespace以后可以简化为一行。
1
2
3
4
5
6
7
8
9
|
<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="person" class="Person" p:name="Tom" p:age="20"/>
</beans>
|
那么什么是p-namespace
那?它的作用就是使用xml中的元素属性取代<property/>
节点来定义bean的属性。这个神奇的p是什么东西那?它其实是使用了namespace的xml扩展配置格式。beans的配置格式是定义在一个xsd格式中的(即 http://www.springframework.org/schema/beans/spring-beans.xsd),但p却没有一个xsd格式文件与其对应,但是它可以被spring内核解析处理。
上面只是演示了对属性为普通值的时使用p-namespace
的注入,如果属性为另一个bean的引用时该如何处理那?很简单。
这是使用正常方式注入属性。
1
2
3
4
5
6
|
<bean id="messageService" class="SimpleMessageService"/>
<bean id="messageHandler" class="MessageHandler">
<property name="messageService">
<ref bean="messageService" />
</property>
</bean>
|
使用p-namespace
后是这样的。
1
2
|
<bean id="messageService" class="SimpleMessageService"/>
<bean id="messageHandler" class=“MessageHandler” p:messageService-ref=“messageService”/>
|
加上-ref
后缀即表示是对一个bean的引用。
那既然setter方法注入bean可以使用p-namespace
,那么构造器方式注入有没有相应的简写那?答案是肯定的,那就是c-namespace
,原理和使用方法与p-namespace
大同小异。
使用c-namespace
前:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<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="person" class="Person">
<constructor-arg name="name">
<value>Tom</value>
</constructor-arg>
<constructor-arg name="age" value="20"/>
</bean>
</beans>
|
使用c-namespace
后:
1
2
3
4
5
6
7
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="person" c:name="Tom" c:age="20"/>
</beans>
|
也可以使用-ref
后缀来表示对另一个bean的引用。
1
2
|
<bean id="messageService" class="SimpleMessageService"/>
<bean id="messageHandler" class="MessageHandler" c:messageService-ref="messageService"/>
|
在前面章节讲解构造器注入时,可以使用构造参数索引来注入依赖,c-namespace
也支持这一方式。
1
2
3
4
5
6
7
8
9
10
11
12
|
<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="person” c:_0="Tom" c:_1="20"/>
<bean id="messageService" class="SimpleMessageService"/>
<bean id="messageHandler" class="MessageHandler" c:_0-ref="messageService"/>
</beans>
|
怎么样,是不是很强大啊。但是太过强大也容易伤人伤己。在项目中使用这些技巧之前最好先和项目成员达成一致。
本例中的源码请在我的GitHub上自行下载。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库