【Spring笔记03】Spring依赖注入各种数据类型
这篇文章,详细介绍一下Spring框架中如何注入各种数据类型,包含:注入基本数据类型、数组、集合、Map映射、Property属性、注入空字符串、注入null值、注入特殊字符等内容,以及如何使用命名空间进行依赖注入。
目录
一、注入各种数据类型
1.1、注入基本类型
1.2、注入Bean对象
(1)外部注入Bean方式
(2)内部注入Bean方式
1.3、注入数组
1.4、注入List集合
1.5、注入Set集合
1.6、注入Map
1.7、注入Property属性
1.8、注入null值和空值
1.9、注入特殊字符
二、命名空间
2.1、p命名空间
2.2、c命名空间
2.3、util命名空间
一、注入各种数据类型
1.1、注入基本类型
注入基本数据类型,既可以采用setter方法注入,也可以采用构造方法注入,两种方式都有不同的限制条件:
- setter方法注入:必须确保注入的属性存在setXXX()方法,否则注入失败。
- 构造方法注入:必须确保Bean对象具有相应的有参构造方法,否则注入失败。
这里我以setter方法注入为案例:

以上,就是setter方法注入的用法,只要在Spring的XML配置文件里面采用【<property>】标签,指定属性名称和属性值就可以啦。
1.2、注入Bean对象
在实际开发过程中,我们一个类里面会用到另外一个类的对象,这个时候就是注入引用对象类型,也就是我们说的Bean对象。注入Bean对象,首先需要确保Bean对象已经被实例化了,然后另外一个Bean里面才能够注入。
注入Bean分为两种:
- 外部注入Bean方式
- 内部注入Bean方式
(1)外部注入Bean方式
外部注入Bean方式,是指:A类中使用了B类的对象,那么首先需要将B类对象进行实例化,然后A类直接引用B类实例化之后的对象。
这里举个栗子,员工和部门的关系,我们就可以两个类来表示,一个是【Emp】员工类,另外一个是【Dept】部门类,案例代码如下所示:
创建【Dept】类:
public class Dept {private Integer deptId;private String deptName;public Integer getDeptId() {return deptId;}public void setDeptId(Integer deptId) {this.deptId = deptId;}public String getDeptName() {return deptName;}public void setDeptName(String deptName) {this.deptName = deptName;}
}
创建【Emp】类:
public class Emp {private Integer empId;private String empName;private Dept dept; // 部门类的对象public Integer getEmpId() {return empId;}public void setEmpId(Integer empId) {this.empId = empId;}public String getEmpName() {return empName;}public void setEmpName(String empName) {this.empName = empName;}public Dept getDept() {return dept;}public void setDept(Dept dept) {this.dept = dept;}
}
添加XML配置

我们把这种直接引用外部Bean的方式,叫做注入外部Bean。
可以发现,我们这里使用的【<property>】标签是通过【ref】属性进行注入Bean的,而不是【value】属性,相信你应该知道这两个的区别了吧。
- value属性:用于注入基本数据类型、字符串之类的。
- ref属性:用于引用另外一个Bean的实例对象。
(2)内部注入Bean方式
外部注入Bean方式是引用外部的一个Bean实例,那内部注入Bean就是不引用外部的Bean呗,而是直接在当前的Bean里面进行实例化。
具体XML配置如下所示:
<!-- 内部注入Bean方式 -->
<bean id="emp2" class="com.spring.demo.pojo.Emp"><!-- 属性赋值 --><property name="empId" value="1001"/><property name="empName" value="张三"/><!-- 注入Bean对象 --><property name="dept"><bean class="com.spring.demo.pojo.Dept"><!-- 属性赋值 --><property name="deptId" value="2001"/><property name="deptName" value="研发部"/></bean></property>
</bean>
是不是很简单,内部注入bean其实就是把另外一个bean的配置移到【<property>】标签之间。
1.3、注入数组
如果类中的某个属性是数组,那就不能和之前一样编写了,因为之前的都是注入单独一个的值,而数组可以有多个值,那么如何注入数组呢???
注入数组,可以借助【<array>】标签,看个案例就知道啦。

采用【<array>】标签告诉Spring,当前这个属性是数组类型的,通过【<value>】标签,告诉Spring数组里面的数值是哪些。
1.4、注入List集合
注入集合和注入数组类似的,只不过注入List集合是采用【<list>】标签进行标识。
<!-- 注入List集合 -->
<bean id="collectionType1" class="com.spring.demo.pojo.CollectionType"><!-- 注入List集合 --><property name="listData"><list><value>张三</value><value>李四</value><value>王五</value></list></property>
</bean>
1.5、注入Set集合
注入Set集合是采用【<set>】标签进行标识。
<!-- 注入Set集合 -->
<bean id="collectionType2" class="com.spring.demo.pojo.CollectionType"><!-- 注入Set集合 --><property name="setData"><set><value>张三</value><value>李四</value><value>王五</value></set></property>
</bean>
1.6、注入Map
注入map比较特殊,因为map和List、Set集合不同,map是具有key-value形式的数据,所以注入map集合,需要采用【<map>】标签定义,然后通过【<entry>】标签进行取值。
【<entry>】标签具有如下属性:
- key属性:指定map集合的key值。
- value属性:指定map集合的value值。
- ref属性:指定map集合的value值(引用另外一个bean对象)。
- key-ref属性:key值引用另外一个Bean对象。
- value-ref属性:value值引用另外一个Bean对象。
具体案例代码如下所示:
<!-- 注入Map集合 -->
<bean id="collectionType3" class="com.spring.demo.pojo.CollectionType"><!-- 注入Map集合 --><property name="map"><map><entry key="1" value="Tom"/><entry key="2" value="Jerry"/><entry key="3" value="Jack"/></map></property>
</bean>
1.7、注入Property属性
Property是HashMap的一个子类,它也是满足key-value形式的数据集合,通过【<props>】标签定义,然后采用【<prop>】标签进行key和value的赋值。另外,还可以读取外部的【property】文件的内容进行注入。
注入Property属性案例:
<!-- 注入Property -->
<bean id="collectionType4" class="com.spring.demo.pojo.CollectionType"><!-- 注入Property --><property name="properties"><props><prop key="1">Tom</prop><prop key="2">Jerry</prop><prop key="3">Jack</prop></props></property>
</bean>
如何定义Property文件???
首先需要创建一个以【.properties】为后缀的文件。
然后在文件中,通过【key=value】的格式,编写对应的数据内容。
注意:一行只能编写一个【key=value】。
从Property文件读取属性案例:
- 在【src/main/resources】目录下,创建一个【jdbc.properties】文件
driver=com.jdbc.mysql.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
- 创建【JdbcProperties】类
public class JdbcProperties {private String driver;private String url;private String username;private String password;// setter and getter
}
- XML配置文件中添加context命名空间
- 注入属性
<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 注入Property --><bean id="collectionType4" class="com.spring.demo.pojo.CollectionType"><!-- 注入Property --><property name="properties"><props><prop key="1">Tom</prop><prop key="2">Jerry</prop><prop key="3">Jack</prop></props></property></bean><!-- 读取外部的Properties文件 --><context:property-placeholder location="jdbc.properties" /><bean id="jdbcProperties" class="com.spring.demo.pojo.JdbcProperties"><!-- 从外部Property文件注入 --><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></bean></beans>
以上,就是注入Property类型。
1.8、注入null值和空值
如何注入null值呢???通过【<null/>】标签即可注入null值。
<!-- 注入null值 -->
<bean id="nullAndEmpty" class="com.spring.demo.pojo.NullAndEmpty"><!-- 注入null值 --><property name="name"><null/></property>
</bean>
如何注入空字符串呢???直接设置【value】属性等于空即可。
<!-- 注入空字符串 -->
<bean id="nullAndEmpty2" class="com.spring.demo.pojo.NullAndEmpty"><!-- 注入空字符串 --><property name="name" value=""/>
</bean>
1.9、注入特殊字符
在XML文件里面,有时候注入的值存在一些特殊字符(例如:<,>符号),此时XML文件会解析失败,因为(<,>符号)是XML文件规定的标签开始结束标记,我们不能在注入的值里面使用???那要如何解决这个问题呢???
解决办法:
- 可以采用【<![CDATA[ 这里写需要注入的值 ]]>】标签进行转义,这是CDATA是XML规范提供的。
举例如下:

以上,就是注入特殊字符的方式。
二、命名空间
从第一部分,我们学习了各种数据类型的注入方式,可以看到,每次我们注入一个属性的时候,都需要编写很多的【<property>】标签,很明显,太麻烦了,所以Spring也支持通过命名空间的方式简写注入。下面介绍一下Spring注入的一些命名空间简写方式。
2.1、p命名空间
这里说的【p命名空间】是用于简写【<property>】标签注入,使用命名空间,首先需要在XML配置文件里面添加命名空间前缀。
添加【p命名空间】前缀
- 需要添加【xmlns: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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- p命名空间注入 --><bean id="user" class="com.spring.demo.pojo.User"p:uid="1001"p:username="张三"p:password="123456"/></beans>
上面,可以看到我们只需要在【<bean>】标签里面,采用【p:属性名称】的方式就可以实现注入,而不需要编写【<property>】标签。
2.2、c命名空间
这里说的【c命名空间】是用于简写【<constructor-arg>】标签注入。
添加【c命名空间】前缀
- 需要添加【xmlns: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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- c命名空间注入: 根据位置 --><bean id="cnamespace" class="com.spring.demo.pojo.Cnamespace" c:_0="1001" c:_1="李四" /><!-- c命名空间注入: 根据名称 --><bean id="cnamespace1" class="com.spring.demo.pojo.Cnamespace" c:id="1001" c:name="李四" /></beans>
【c命名空间】是构造方法注入的简写,可以两种方式:
- 根据参数位置注入:【c:_下标位置】
- 根据参数名称注入:【c:属性名称】
2.3、util命名空间
util命名空间,可以将注入集合的那些部分提取出一个公共内容,然后其他地方需要注入的时候,就可以直接引用,而不需要重复的编写。
添加【util命名空间】前缀
- 需要添加【xmlns:util】开头的前缀。
<?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-4.0.xsd"></beans>
util命名空间的使用

util命名空间,常用的有如下几个:
【<util:list>】、【<util:set>】、【<util:map>】、【<util:properties>】
综上,这篇文章,详细介绍一下Spring框架中如何注入各种数据类型,包含:注入基本数据类型、数组、集合、Map映射、Property属性、注入空字符串、注入null值、注入特殊字符等内容,以及如何使用命名空间进行依赖注入。
相关文章:
【Spring笔记03】Spring依赖注入各种数据类型
这篇文章,详细介绍一下Spring框架中如何注入各种数据类型,包含:注入基本数据类型、数组、集合、Map映射、Property属性、注入空字符串、注入null值、注入特殊字符等内容,以及如何使用命名空间进行依赖注入。 目录 一、注入各种数据…...
2023计算机保研——双非上岸酒吧舞
我大概是从22年10月份开始写博客的,当时因为本校专业的培养方案的原因,课程很多,有些知识纸质记录很不方便,于是选择了打破了自己的成见使用博客来记录学习生活。对于我个人而言,保研生活在前一大半过程中都比较艰难&a…...
《计算机视觉中的多视图几何》笔记(13)
13 Scene planes and homographies 本章主要讲述两个摄像机和一个世界平面之间的射影几何关系。 我们假设空间有一平面 π \pi π,平面上的一点为 x π x_{\pi} xπ。 x π x_{\pi} xπ分别在两幅图像 P , P ′ P, P P,P′上形成了 x , x ′ x, x x,x′。 那…...
H5移动端购物商城系统源码 小型商城全新简洁风格全新UI 支持易支付接口
一款比较简单的 H5 移动端购物商城系统源码,比较适合单品商城、小型商城使用。带有易支付接口。 源码下载:https://download.csdn.net/download/m0_66047725/88391704 源码下载2:评论留言或私信留言...
全志ARM926 Melis2.0系统的开发指引⑤
全志ARM926 Melis2.0系统的开发指引⑤ 编写目的8. 固件修改工具(ImageModify)使用8.1.界面说明8.2.操作步骤8.2.1. 配置平台8.2.2. 选择固件8.2.3. 选择要替换的文件8.2.4. 替换文件8.2.5. 保存固件 8.3.注意事项8.4.增加固件修改权限设置8.4.1. 概述8.4.2. 操作说明8.4.2.1.打…...
【AI视野·今日Robot 机器人论文速览 第四十七期】Wed, 4 Oct 2023
AI视野今日CS.Robotics 机器人学论文速览 Wed, 4 Oct 2023 Totally 40 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚基于神经网络的多模态触觉感知, classification, position, posture, and force of the grasped object多模态形象的解耦(f…...
GPX可视化工具 GPX航迹预览工具
背景 当我们收到别人分享的航迹文档,即gpx文档时,如何快速的进行浏览呢?我们可以使用GIS软件来打开gpx文档并显示gpx中所记录的航迹,例如常用的GIS软件有googleEarth, Basecamp, GPXsee, GPX E…...
学信息系统项目管理师第4版系列18_采购管理
1. 协议 1.1. 合同 1.1.1. 国际合作的项目经理应牢记,无论合同规定如何详尽,文化和当地法律对合同及其可执行性均有影响 1.2. 服务水平协议(SLA) 1.3. 谅解备忘录 1.4. 协议备忘录(MOA) 1.5. 订购单 …...
标准化数据模型
标准化数据模型 标准化被定义为减少或消除数据集中冗余的过程。 它已成为关系数据库中数据建模的事实上的方法,很大程度上是由于这些系统最初设计时所围绕的底层资源限制:缓慢的磁盘和昂贵的 RAM。更少的数据冗余/重复意味着更有效地从磁盘读取数据并占…...
linux平台源码编译ffmpeg
目录 编译平台 编译步骤 编译平台 中标麒麟 编译步骤 1 从Download FFmpeg 下载源码,我选中了4.2.9版 2 解压 3 在解压后的目录下输入 ./configure --enable-shared --prefix/usr/local/ffmpeg 4 make 5 sudo make install 6 ffmpeg的头文件、可执行程…...
Vue中如何进行拖拽与排序功能实现
在Vue中实现拖拽与排序功能 在Web应用程序中,实现拖拽和排序功能是非常常见的需求,特别是在管理界面、任务列表和图形用户界面等方面。Vue.js作为一个流行的JavaScript框架,提供了许多工具和库来简化拖拽和排序功能的实现。本文将介绍如何使…...
新款UI动态壁纸头像潮图小程序源码
新款UI动态壁纸头像潮图小程序源码,不需要域名服务器,直接添加合法域名,上传发布就能使用。 可以对接开通流量主,个人也能运营,不需要服务器源码完整。整合头像,动态壁纸,文案功能齐全。 源码…...
Python逐日填补Excel中的日期并用0值填充缺失日期的数据
本文介绍基于Python语言,读取一个不同的列表示不同的日期的.csv格式文件,将其中缺失的日期数值加以填补;并用0值对这些缺失日期对应的数据加以填充的方法。 首先,我们明确一下本文的需求。现在有一个.csv格式文件,其第…...
【C语言经典100例题-70】求一个字符串的长度(指针)
代码 使用指针来遍历字符串,直到遇到字符串结尾的空字符\0为止,统计字符数量即为字符串长度。 #include<stdio.h> #define n 20 int getlength(char *a) {int len 0;while(*a!\0){len;a;}return len; } int main() {char *arr[n] { 0 };int l…...
十天学完基础数据结构-第八天(哈希表(Hash Table))
哈希表的基本概念 哈希表是一种数据结构,用于存储键值对。它的核心思想是将键通过哈希函数转化为索引,然后将值存储在该索引位置的数据结构中。 哈希函数的作用 哈希函数是哈希表的关键部分。它将输入(键)映射到哈希表的索引位…...
flink集群部署
虚拟机配置 bigdata-hmaster 192.168.135.112 4核心 32GB bigdata-hnode1 192.168.135.113 4核心 16GB bigdata-hnode2 192.168.135.114 4核心 16GB 安装包:https://dlcdn.apache.org/flink/flink-1.17.1/flink-1.17.1-bin-scala_2.12.tgz 放到/usr/lcoal/lib目录…...
2.证明 非单一点 Oct.2023
目录 原题解引申出的编程问题非单一点题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题解题目正解 原题 已知等边 Δ P 0 P 1 P 2 \Delta P_0P_1P_2 ΔP0P1P2,它的外接圆是 O O O,设 O O O的半径是 R R R。同时,设 Δ …...
常见的软件脱壳思路
单步跟踪法 1.本方法采用OD载入。 2.跟踪F8,实现向下的跳。 3.遇到程序回跳按F4。 4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现! 5.刚载入程序有一个CALL的,我们就F7跟进去,不然程序很容…...
Python:torch.nn.Conv1d(), torch.nn.Conv2d()和torch.nn.Conv3d()函数理解
Python:torch.nn.Conv1d(), torch.nn.Conv2d()和torch.nn.Conv3d()函数理解 1. 函数参数 在torch中的卷积操作有三个,torch.nn.Conv1d(),torch.nn.Conv2d()还有torch.nn.Conv3d(),这是搭建网络过程中常用的网络层,为了用好卷积层࿰…...
scala 连接 MySQL 数据库案例
1 依赖准备 mysql 8添加: <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency> mysql 5 添加: <dependency><grou…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
