Spring中Setter注入详解

news2025/7/17 2:31:35

目录

一、setter注入是什么

二、setter注入详解

三、JDK内置类型注入方式

3.1 数组类型

3.2 set集合类型

3.3 list集合

3.4 map集合

3.5 properties类型

四、用户自定义类型


一、setter注入是什么

书接上回,我们发现在Spring配置文件中为类对象的属性赋值时,是Spring通过调用类中的setter方法。接下要就通过代码的形式来具体分析

1)此时将Person类中的setter方法加入打印语句,如果使用Spring注入的时候进行了打印说明Spring是通过调用setter方法来实现注入的

public class Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        System.out.println("Spring调用setName");
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        System.out.println("Spring调用setName");
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

2)接下来执行测试代码,此处是直接使用了Spring的配置文件注入(在这里有疑问的同学,可以移步我前面的文章)

public void test3() {
    // 通过Spring提供的接口获取到类对象
    ApplicationContext ctx =
            new ClassPathXmlApplicationContext("applicationContext.xml");
    Person person = (Person) ctx.getBean("person");
    // 传统的方式是直接用person对象调用setter方法,但是会产生耦合
    // person.setName("李四");
    // person.setAge(20);
    System.out.println(person);
}

此时运行的结果进行了打印,说明Spring底层进行注入是通过调用类中的setter方法,这也就说为什么一定要在类中加上setter方法才能进行注入的原因。这种注入方式也叫做setter注入

 

二、setter注入详解

setter注入是Spring通过配置文件调用类中的setter方法来实现的。此时是使用property+value标签来实现注入的,其中property对应的是需要注入的属性,value对应的是给属性注入的值。好!到这里问题就出来了,这里String和int类型是这样注入的,那换成其他类型(double、char、数组)怎么去注入呢?

接下来通过一张图来展示setter注入的两种方式,一种是JDK内置类型注入方式、另一种是用户自定义类型的注入方式。其中JDK内置类型也就是Java自带的类型包括八种基本类型(int...)、数组...,自定义类型则是用户自己定义的(比如userDAO....)

 

三、JDK内置类型注入方式

之前我们已经知道了8中基本类型的注入方式了,那么接下来就演示一下上图中的其他几种类型的注入方式

3.1 数组类型

首先不管是什么类型的注入,都需要添加setter方法,不然注入是会失败的。在Person类中添加一个emails数组,这里为了简洁其他的属性就不展示了

public class Person {
    // 为了后续测试方便这里就直接用public了
    public String[] emails;
    public String[] getEmails() {
        return emails;
    }
    public void setEmails(String[] emails) {
        this.emails = emails;
    }
}

其实数组的注入就是添加一个list标签,然后在list标签中使用value标签注入值

<bean id="person" class="com.gl.demo.model.Person">
    <property name="emails">
    <!-- 由于数组有多个,这里就不再是value标签了,而是使用list -->
        <list>
    <!-- 在list标签中嵌套多个value标签-->
            <value>12456@qq.com</value>
            <value>78910@qq.com</value>
        </list>
    </property>
</bean>

接下来测试emails中是否真的注入了值 

public void test3() {
    ApplicationContext ctx =
            new ClassPathXmlApplicationContext("applicationContext.xml");
    Person person = (Person) ctx.getBean("person");
    for (String s:person.emails) {
        System.out.println(s);
    }
}

结果显示注入已经成功了

3.2 set集合类型

添加一个号码集合,同样的还是需要在类中添加setter方法

public class Person {
    public Set<String> tels;
    public Set<String> getTels() {
        return tels;
    }
    public void setTels(Set<String> tels) {
        this.tels = tels;
    }
}

为set属性注入的时候就是添加一个set标签,然后在set标签中添加value标签注入值 

<bean id="person" class="com.gl.demo.model.Person">
    <property name="tels">
        <!-- 这里是set集合,标签使用的也就是set -->
        <set>
            <!-- 在set标签中嵌套多个value标签注入不同的号码号码-->
            <value>1381111111</value>
            <value>1521111111</value>
            <value>1981111111</value>
            <!-- set标签中不一定只能写value标签,也可以写其他的标签-->
            <list></list>
        </set>
    </property>
</bean>
public void test() {
    ApplicationContext ctx =
            new ClassPathXmlApplicationContext("applicationContext.xml");
    Person person = (Person) ctx.getBean("person");
    for (String s:person.tels) {
        System.out.println(s);
    }
}

3.3 list集合

list集合的注入方式其实是和数组的注入方式是一致的,因为list集合的底层就是通过数组来实现的,这里参考2.1.1即可。但是值得注意的是,list集合注入的时候也可以在list标签中写其他的标签

3.4 map集合

为了文章的简洁性这里就不再写setter方法了,接下来添加一个qq的map属性

public Map<String,String> qqs;
<bean id="person" class="com.gl.demo.model.Person">
    <property name="qqs">
        <!-- map标签使用当然就是map标签啦-->
        <map>
            <!-- 在map中我们也知道其中是由entry来实现的所以这里的标签是entry -->
            <entry>
               <!-- 其中的key也就是key标签 -->
                <key>
                    <!-- 这里的key是String,所以就用value标签来注入值 可以写不同的标签-->
                    <value>pengyuyan</value>
                </key>
                <value>
                    <!-- 这里的value是String,所以就用value标签来注入值 可以写不同的标签-->
                    2656111111
                </value>
            </entry>
            <entry>
                <key>
                    <value>wuyanzu</value>
                </key>
                <value>
                    3332262654
                </value>
            </entry>
        </map>
    </property>
</bean>

3.5 properties类型

public Properties props;
<bean id="person" class="com.gl.demo.model.Person">
    <property name="props">
    <!-- 这里的props其实就是properties的简写-->
       <props>
    <!-- 在props中写对应的key-value值 -->
           <prop key="url">mysql</prop>
           <prop key="name">root</prop>
           <prop key="password">123</prop>
       </props>
    </property>
</bean>

四、用户自定义类型

此时我有两个类,一个是UserService类,另一个是UserDao类,其中UserService中有一个UserDao的对象,此时要怎么为userDao对象赋值呢?一定不要忘记了属性的setter方法!

public class UserService {
    // 此时使用setter注入的方式为userDao赋值
    UserDao userDao;
    // 为了演示方便业务逻辑就不写了
    public UserDao getUserDao() {
        return userDao;
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}
public class UserDao {
    // 此处为了展示简洁就不写具体的逻辑了
}

首先进行分析,我要在UserService类中为UserDao的类对象赋值,是不是应该要先创建UserService类呢?创建好了之后,由于UserDao是一个类对象,那不是不是可以使用Bean标签直接来创建呢?通过这里的分析我们得到了如下配置文件书写的方式

<bean id="userService" class="com.gl.demo.service.UserService" >
    <property name="userDao">
        <bean id="userDao" class="com.gl.demo.dao.UserDao"/>
    </property>
</bean>

写到这里,问题出来了,我的service在以后是不是有很多啊,那我每次创建一个service类是不是每次都要创建一个userDao对象,这样是不是就造成了严重的代码冗余?其次创建的userDao对象多了是不是就会浪费Jvm中的资源。为了解决这个问题,接下来采取以下方法:

1)首先先使用Bean创建好需要的类对象

2)然后使用 一个 ref 引用标签来引用创建好的 对象标签的id即可

<bean id="userDao" class="com.gl.demo.dao.UserDao"/>

<bean id="userService" class="com.gl.demo.service.UserService">
    <property name="userDao">
        <ref bean="userDao"/>
    </property>
</bean>

简化版: 

<bean id="userDao" class="com.gl.demo.dao.UserDao"/>

<bean id="userService" class="com.gl.demo.service.UserService" p:userDao-ref="userDao"/>

至此,Spring中setter注入的几种常见的方式就完毕了。以上列举的只是使用的比较多的类型,并不是说只有这些类型。

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

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

相关文章

java SpringBoot基础

目录 SpringBootWeb快速入门前言需求开发步骤创建SpringBoot工程&#xff08;需要联网&#xff09;定义请求处理类运行测试 HTTP协议HTTP概述HTTP-请求协议格式GET方式的请求协议POST方式的请求协议 HTTP-响应协议格式HTTP-协议解析 WEB服务器-Tomcat简介基本使用注意事项 Spri…

智慧渔业方案:AI渔政视频智能监管平台助力水域禁渔执法

一、方案背景 国内有很多水库及河流设立了禁渔期&#xff0c;加强渔政执法监管对保障国家渔业权益、维护渔业生产秩序、保护渔民群众生命财产安全、推进水域生态文明建设具有重要意义。目前&#xff0c;部分地区的监管手段信息化水平低下&#xff0c;存在人员少、职责多、任务…

排序【七大排序】

文章目录 1. 排序的概念及引用1.1 排序的概念1.2 常见的排序算法 2. 常见排序算法的实现2.1 插入排序2.1.1基本思想&#xff1a;2.1.2 直接插入排序2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序2.2.1基本思想&#xff1a;2.2.2 直接选择排序:2.2.3 堆排序 2.3 交换排序2.3.1冒…

新一代开源语音库CoQui TTS冲到了GitHub 20.5k Star

Coqui TTS 项目介绍 Coqui 文本转语音&#xff08;Text-to-Speech&#xff0c;TTS&#xff09;是新一代基于深度学习的低资源零样本文本转语音模型&#xff0c;具有合成多种语言语音的能力。该模型能够利用共同学习技术&#xff0c;从各语言的训练资料集转换知识&#xff0c;来…

Leetcode刷题详解——将x减到0的最小操作数

1. 题目链接&#xff1a;1658. 将 x 减到 0 的最小操作数 2. 题目描述: 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作…

windows常用命令

一.文件操作 dir&#xff1a;查看文件当前路径目录列表 cd .. &#xff1a;返回上一级目录 cd 路径&#xff1a;进入路径

解决telnet不是内部或外部以及验证某个端口是否开放

1.怎么解决telnet不是内部或外部命令 &#xff08;1&#xff09;telnet在win10下默认是不开启的&#xff0c;所以需要我们自己手动开启。 &#xff08;2&#xff09;在控制面板中&#xff0c;我们选择程序–启动或关闭windows功能&#xff0c;然后勾选Telnet客户端选项&#…

Python 连接数据库添加字段

任务需求&#xff1a; 数据库hospital集合所有数据添加一个八位数的编码 import pymongo# 连接数据customer&#xff08;库&#xff09;hospital&#xff08;集合&#xff09; client pymongo.MongoClient(host127.0.0.1) db client.customer collection db.hospitalhospit…

正向代理与反向代理

正向代理 客户端想要直接与目标服务器连接&#xff0c;但是无法直接进行连接&#xff0c;就需要先去访问中间的代理服务器&#xff0c;让代理服务器代替客户端去访问目标服务器 反向代理 屏蔽掉服务器的信息&#xff0c;经常用在多台服务器的分布式部署上&#xff0c;像一些大型…

Unreal Engine 4 + miniconda + Python2.7 + Pycharm

1.​首先启用UE4插件里的Python Scripting插件 ​ 2. 在UE4项目设置中 开启Python开发者模式 生成unreal.py文件&#xff0c;用于在Pychram中引入Unreal PythonAPI 生成的unreal.py 在&#xff1a; "项目路径\Intermediate\PythonStub\unreal.py"3. 安装Miniconda…

问题记录1 json解析问题

问题&#xff1a; json解析int类型不符合预期&#xff0c;使用json.NewDecoder解决。 示例如下&#xff1a; package mainimport ("bytes""encoding/json""fmt" )func main() {data1 : map[string]interface{}{}data1["id"] int64(4…

纽交所上市公司安费诺宣布将以1.397亿美元收购无线解决方案提供商PCTEL

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;纽交所上市公司安费诺(APH)宣布将以每股7美元现金&#xff0c;总价格1.397亿美元收购无线解决方案提供商PCTEL(PCTI)。 该交易预计将在第四季度或2024年初完成。 Lake Street Capital Markets担任…

如何通过工单管理系统提高服务质量和客户满意度?

在这个高速发展的时代&#xff0c;企业面临着前所未有的挑战。其中&#xff0c;如何提高工作服务效率&#xff0c;成为了摆在每个企业面前的关键问题。在这个背景下&#xff0c;一款全新的工单管理系统——“的修”应运而生&#xff0c;它可以为您提供了优化工单流程的解决方案…

Java —— 运算符

目录 1. 什么是运算符 2. 算术运算符 2.1 基本四则运算符: 加减乘除模( - * / %) 2.2 增量运算符 - * %与 自增/自减运算符 -- 3. 关系运算符 4. 逻辑运算符 4.1 逻辑与 && 4.2 逻辑或|| 4.3 逻辑非 ! 4.4 短路求值 5. 位运算符 5.1 按位与 & 5.2 按位或 5.3 按位…

Day2力扣打卡

打卡记录 无限数组的最短子数组&#xff08;滑动窗口&#xff09; 链接 思路&#xff1a;先求单个数组的总和&#xff0c;再对两个重复数组所组成的新数组上使用 不定长的滑动窗口 来求得满足目标的最小长度。 class Solution { public:int minSizeSubarray(vector<int>…

项目经理每天,每周,每月的工作清单

很多不懂项目管理的伙伴问&#xff0c;项目经理每天每周每个月的工作是什么呢&#xff1f; 仿佛他们什么都管&#xff0c;但是又没有具体的产出&#xff0c;但是每天看他们比谁都忙&#xff0c;其实很简单&#xff0c;项目中的每个环节负责具体的事情&#xff0c;但是每个环节…

一文秒懂AGC/AVC,以及什么是光伏电站AGC,AVC装置?AGC,AVC装置的功能与用途?

一&#xff1a;什么是光伏电站 AGC,AVC&#xff1f; 电力系统中的AGC代表自动发电控制&#xff08;Automatic Generation Control&#xff09;&#xff0c;AVC代表自动电压控制&#xff08;Automatic Voltage Control&#xff09;。 AGC是一种用于调节发电机输出功率的自动控…

VMware 配置记录

VMware 配置笔记 CentOS 7.9 镜像下载 官网太慢&#xff0c;建议在阿里云镜像站去CentOS配置页找标准版下载。 选标准版即可&#xff0c;各版本区别&#xff1a; DVD&#xff1a;标准版&#xff0c;包含常用软件&#xff0c;体积为 4.4 G&#xff1b;Everything&#xff1a…

可信执行环境简介:ARM 的 TrustZone

目录 可信执行环境安全世界与普通世界 - 上下文切换机制ARMv7 中的异常处理ARMv8 中的异常处理 信任区商业实施TrustZone 本身的漏洞高通Trustonic 信任区强化的弱点结论声明 可信执行环境 具有信任区的 ARM 处理器实现了架构安全性每个物理处理器内核提供两个虚拟的扩展 核心…

英国人工智能公司【TitanML】完成280万美元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于英国伦敦的人工智能公司【TitanML】近期宣布已完成280万美元种子轮融资&#xff0c;该公司的产品允许机器学习团队部署大型语言模型(llm)。 本轮融资由Octopus Ventures领投&#xff0c;还…