Spring 命名空间注入:p、c 与 .util 的深度解析

在 Spring 框架的开发过程中,XML 配置是一种常见且强大的方式来管理 Bean。为了让配置更加简洁、易读,Spring 提供了多种命名空间注入的方法,其中 p 命名空间注入、c 命名空间注入和 .util 命名空间尤为重要。本文将详细介绍这三种命名空间的作用、使用场景,并结合代码示例进行深入解析。

一、p 命名空间注入

1. 作用与原理

p 命名空间注入主要用于简化 Bean 属性的注入配置。传统的 Spring XML 配置使用 <property> 标签进行属性注入,当 Bean 的属性较多时,配置文件会变得冗长。p 命名空间通过一种更简洁的语法来实现相同的功能,它直接在 <bean> 标签内以属性的形式指定要注入的值,其原理是利用 JavaBean 的 setter 方法进行属性赋值。

2. 代码示例

定义 Java 类

package com.example;public class User {private String name;private int age;public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{name='" + name + "', age=" + age + "}";}
}

Spring XML 配置

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.example.User" p:name="Alice" p:age="28"/>
</beans>

测试代码

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");User user = context.getBean("user", User.class);System.out.println(user);}
}

3. 解释

在上述代码中,通过 xmlns:p="http://www.springframework.org/schema/p" 引入了 p 命名空间。<bean id="user" class="com.example.User" p:name="Alice" p:age="28"/> 这种写法相当于传统的:

<bean id="user" class="com.example.User"><property name="name" value="Alice"/><property name="age" value="28"/>
</bean>

p 命名空间的使用使配置更加简洁直观。

二、c 命名空间注入

1. 作用与原理

c 命名空间注入用于通过构造函数进行 Bean 的属性注入。在某些情况下,Bean 的属性需要在创建对象时就进行初始化,使用构造函数注入可以确保对象在创建后就处于一个完整的状态。c 命名空间利用 Java 类的构造函数来完成属性的赋值。

2. 代码示例

定义 Java 类

package com.example;public class Book {private String title;private double price;public Book(String title, double price) {this.title = title;this.price = price;}@Overridepublic String toString() {return "Book{title='" + title + "', price=" + price + "}";}
}

Spring XML 配置

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="book" class="com.example.Book" c:title="Spring in Action" c:price="59.99"/>
</beans>

测试代码

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Book book = context.getBean("book", Book.class);System.out.println(book);}
}

3. 解释

通过 xmlns:c="http://www.springframework.org/schema/c" 引入 c 命名空间。

<bean id="book" class="com.example.Book" c:title="Spring in Action" c:price="59.99"/> 这种写法会调用 Book 类的构造函数 Book(String title, double price) 进行属性注入,相当于传统的:

<bean id="book" class="com.example.Book"><constructor-arg name="title" value="Spring in Action"/><constructor-arg name="price" value="59.99"/>
</bean>

三、.util 命名空间

1. 作用与原理

.util 命名空间提供了一些实用的标签,用于处理集合、常量等。它可以帮助我们更方便地配置和管理复杂的数据结构,如列表、集合、映射等。这些标签可以在 XML 配置中直接创建和初始化集合对象。

2. 代码示例

定义 Java 类

package com.example;import java.util.List;public class Library {private List<String> books;public void setBooks(List<String> books) {this.books = books;}@Overridepublic String toString() {return "Library{books=" + books + "}";}
}

Spring XML 配置

<?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:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsd"><util:list id="bookList"><value>Java Programming</value><value>Database Design</value><value>Web Development</value></util:list><bean id="library" class="com.example.Library"><property name="books" ref="bookList"/></bean>
</beans>

测试代码

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Library library = context.getBean("library", Library.class);System.out.println(library);}
}

3. 解释

通过 xmlns:util="http://www.springframework.org/schema/util" 引入 .util 命名空间。<util:list id="bookList"> 标签创建了一个列表对象,并添加了几个字符串元素。然后,将这个列表对象通过 <property name="books" ref="bookList"/> 注入到 Library 类的 books 属性中。

四、总结

p 命名空间、c 命名空间和 .util 命名空间都是 Spring 框架为了简化 XML 配置而提供的强大工具。p 命名空间简化了属性注入,c 命名空间方便了构造函数注入,.util 命名空间则用于处理集合等复杂数据结构。合理使用这些命名空间可以让 Spring 配置文件更加简洁、易读,提高开发效率。

以上博文详细介绍了 Spring 中 p 命名空间注入、c 命名空间注入和 .util 命名空间的相关内容,并配有完整的代码示例。如果你对其中某些部分还需要进一步展开说明,或者有其他修改建议,欢迎随时告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/78284.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/78284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RUST变量学习笔记

1&#xff0c;作用域概念 捕获环境 2&#xff0c;所有权概念 Rust则是通过所有权和借用来保证内存安全。很多人不理解为啥说Rust是内存安全的&#xff0c;其实就是在默认情况下&#xff0c;你是写不出内存不安全的代码的。 Rust的所有权并不难理解&#xff0c;它有且只有如下…

探索 Spring AI 的 ChatClient API:构建智能对话应用的利器

探索 Spring AI 的 ChatClient API&#xff1a;构建智能对话应用的利器 前言 在当今人工智能蓬勃发展的时代&#xff0c;智能对话系统成为了众多应用的核心组成部分。无论是客服机器人、智能助手还是聊天应用&#xff0c;都离不开高效、灵活的对话处理能力。Spring AI 作为 S…

开源ERP系统对比:Dolibarr、ERPNext与Odoo

对于寻求开源ERP解决方案的企业而言&#xff0c;Dolibarr、ERPNext和Odoo是三个备受关注的选择。它们各自拥有独特的优势和特点&#xff0c;适用于不同规模和需求的组织。以下是对这三个系统的详细介绍和对比&#xff0c;以帮助您更好地理解它们的差异&#xff0c;并结合中文支…

【2025年】MySQL面试题总结

文章目录 1. MySQL 支持哪些存储引擎&#xff1f;默认使⽤哪个&#xff1f;2. MyISAM 和 InnoDB 有什么区别&#xff1f;3. 事务的四大特性?4. 并发事务带来了哪些问题?5. 不可重复读和幻读有什么区别&#xff1f;6. MySQL 事务隔离级别&#xff1f;默认是什么级别&#xff1…

Linux常用命令29——delgroup删除组

在使用Linux或macOS日常开发中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;delgroup 是用于删除用户组的一个命令。此命令通常由超级用户&#xff08;root&#xff09;运行&#xff0c;或者通过 sudo 提权来操作。本篇学习记录delgroup命令的基本使用。 下面…

字节暑期实习-网络运维工程师面经

岗位描述 这个是ByteIntern实习&#xff0c;是暑期实习岗位 岗位 一面 先自我介绍 抓项目技术&#xff08;会进行确认是什么技术&#xff09; TCP的三次握手和四次挥手 序列号和确认应答号的位置和大小 序列号是随机的吗&#xff1f; 序列号为什么是随机的&#xff1f; …

5.3刷题

P3370 【模板】字符串哈希 #include<bits/stdc.h> using namespace std; #define int long long typedef unsigned long long ull; int n; ull myhash(string s){ull code 0, x 131, y 140814840257324663;for(int i 0; i < s.size(); i){code (code * x (ull)…

Kettle下载安装教程

## 什么是Kettle Kettle&#xff08;现在也称为Pentaho Data Integration&#xff0c;简称PDI&#xff09;是一款开源的ETL&#xff08;Extract-Transform-Load&#xff09;工具&#xff0c;用于数据抽取、转换和加载。它允许用户通过图形化界面设计和执行数据集成流程&#xf…

FreeRtos实战从入门到精通--任务创建和删除(动态方法)--事了拂衣去,深藏功与名

FreeRtos是之前的一些聪明的工程师写的免费且开源的嵌入式实时操作系统代码&#xff0c;由于我们实际工作中不需要再去写rtos&#xff0c;我们只需要用就行了&#xff0c;所以博主这里只分享项目工程实战相关的内容&#xff0c;具体rtos源码&#xff0c;可以无需理会&#xff0…

Java通用Mapper自定义方法

目录 一、定义通用 Mapper 接口二、继承通用 Mapper 实现自定义方法三、注册自定义 Mapper 接口四、在实体类对应的 Mapper 接口中使用自定义方法五、实现自定义方法的 SQL 逻辑注解方式XML 映射文件方式六、使用自定义方法七、注意事项在 Java 持久层开发中,MyBatis 的通用 M…

Android WebRTC回声消除

文章目录 安卓可用的回声消除手段各种回声消除技术优缺点WebRTC回声消除WebRTC回声消除回声消除处理流程WebRTC AECM APP 安卓可用的回声消除手段 硬件回声消除 使用 AudioRecord 的 VOICE_COMMUNICATION 模式&#xff1a;通过 AudioRecord 的 VOICE_COMMUNICATION 音频源可以…

基于 SAFM 超分辨率上采样模块的 YOLOv12 改进方法—模糊场景目标检测精度提升研究

在复杂视觉环境中,如低光照、雾天或远距离拍摄等场景下,图像质量下降导致目标模糊,使得传统目标检测模型难以实现高精度识别。YOLO系列作为主流单阶段检测框架,在速度和精度方面表现出色,但在模糊和小目标场景中仍存在性能瓶颈。本文提出一种面向 YOLOv12 的创新性改进方法…

Spring 事务的底层原理常见陷阱

一、Spring 事务的底层原理 1. 核心机制 动态代理&#xff08;AOP&#xff09;&#xff1a; Spring 通过动态代理&#xff08;JDK 或 CGLIB&#xff09;生成代理对象&#xff0c;拦截被 Transactional 注解标记的方法。事务拦截器&#xff1a; TransactionInterceptor 负责管…

Java SE(6)——类和对象(一)

1.初始面向对象 1.1 什么是面向对象 Java是一门纯面向对象的编程语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交换来完成一件事情 1.2 面向过程…

cpp细碎知识点

1 重写 (Override): 派生类中定义一个与基类虚函数具有相同函数签名&#xff08;函数名、参数列表、返回类型&#xff09;的函数&#xff0c;这被称为重写。 重写意味着派生类提供了基类虚函数的一个特定于派生类的实现。 重写是实现多态的关键 2 虚基类 (Virtual Base Class…

若依 FastAPI + Vue3 项目 Docker 部署笔记( 启动器打包教程)

本文记录了将 start.bat 打包成 .exe 启动器的详细教程&#xff0c;适合项目交付或导师演示用。 &#x1f9ed; 一、如何将 start.bat 打包为启动器 .exe&#xff08;含图标 自动打开浏览器&#xff09; ✅ 1. 创建三大功能脚本 start.bat → 启动项目&#xff08;docke…

基于springboot的金院银行厅预约系统的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;信息管理系统的实施在技术上已逐步成熟。信息管理系统是一个不断发展的新型学科&#xff0c;任何一个单位要生存要发展&#xff0c;要高效率地把内部活动有机地组织起来&#xff0c;就必须建立与自身特点相适应的…

创意控制台:下雨动画特效(ASCII 雨滴下落)

在编程的世界里&#xff0c;控制台不仅仅是输出文本信息的工具&#xff0c;通过巧妙的代码设计&#xff0c;我们还能在其中创造出充满趣味的动态画面。本文将带领大家使用 C 语言打造一个创意控制台下雨动画特效&#xff0c;利用 ASCII 字符模拟雨滴下落的过程&#xff0c;为单…

MySQL--索引入门

MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 Mysql在存储数据之外&#xff0c;数据库系统各种还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种引用&#xff08;指向&#xff09;表中的数据…

MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong

接上文 MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - user/_sleep 是什么&#xff1f;做什么&#xff1f; pingpong 不务正业了那么久(然而并没有&#xff0c;虽然还在探索sleep&#xff0c;但是教材我已经看完了前三章了)&#xff0c;让我们赶紧继续下去 在进行本实验之前请务…