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
英文地址,請注明出處:http://en.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;讓我們趕緊繼續下去 在進行本實驗之前請務…