【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】类:

java 复制代码
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】类:

java 复制代码
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配置如下所示:

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>】标签进行标识。

XML 复制代码
<!-- 注入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>】标签进行标识。

XML 复制代码
<!-- 注入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对象。

具体案例代码如下所示:

XML 复制代码
<!-- 注入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属性案例:

XML 复制代码
<!-- 注入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】文件
java 复制代码
driver=com.jdbc.mysql.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
  • 创建【JdbcProperties】类
java 复制代码
public class JdbcProperties {
    private String driver;
    private String url;
    private String username;
    private String password;

    // setter and getter
}
  • XML配置文件中添加context命名空间
  • 注入属性
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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://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值。

XML 复制代码
<!-- 注入null值 -->
<bean id="nullAndEmpty" class="com.spring.demo.pojo.NullAndEmpty">
    <!-- 注入null值 -->
    <property name="name">
        <null/>
    </property>
</bean>

如何注入空字符串呢???直接设置【value】属性等于空即可。

XML 复制代码
<!-- 注入空字符串 -->
<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 复制代码
<?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">

</beans>

p命名空间使用案例

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/beans
       http://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 复制代码
<?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">

</beans>

c命名空间使用

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/beans
       http://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 复制代码
<?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/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/util
       http://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值、注入特殊字符等内容,以及如何使用命名空间进行依赖注入。

相关推荐
卓怡学长1 小时前
w268基于springboot + vue 物流系统
java·数据库·vue.js·spring boot·spring·intellij-idea
ACGkaka_2 小时前
Spring Boot 实战(四十二):集成 Spring AI 六大场景
人工智能·spring boot·spring
卓怡学长18 小时前
w269基于spring boot + vue 候鸟监测数据管理系统
java·数据库·spring boot·spring·intellij-idea
Listen·Rain1 天前
向量化详解
java·人工智能·spring·机器学习·ai
添砖java_8571 天前
网页聊天室测试报告
java·spring boot·spring·maven
xixingzhe21 天前
Spring 依赖注入
java·后端·spring
闲猫1 天前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
醇氧2 天前
Spring 容器 Map 注入机制详解
java·后端·spring
ylscode2 天前
Cloudflare Workers Cache 深度解析:边缘缓存如何重塑无服务器性能边界
java·spring·mybatis
沉静的小伙2 天前
Spring事务
java·数据库·spring