Spring中Setter注入详解

目录

一、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;}@Overridepublic 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.rhkb.cn/news/162427.html

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

相关文章

MATLAB——RBF、GRNN和PNN神经网络案例参考程序

欢迎关注“电击小子程高兴的MATLAB小屋” GRNN_PNN程序 %% I. 清空环境变量 clear all clc %% II. 训练集/测试集产生 %% % 1. 导入数据 load iris_data.mat %% % 2 随机产生训练集和测试集 P_train []; T_train []; P_test []; T_test []; for i 1:3 temp_input …

编辑器功能:用一个快捷键来【锁定】或【解开】Inspector面板

一、需求 我有一个脚本&#xff0c;上面暴露了许多参数&#xff0c;我要在场景中拖物体给它进行配置。 如果不锁定Inspector面板的话&#xff0c;每次点击物体后&#xff0c;Inspector的内容就是刚点击的物体的内容&#xff0c;而不是挂载脚本的参数面板。 二、 解决 &…

adb调试Linux嵌入式设备记录

1. ADB的全称为Android Debug Bridge&#xff0c;调试设备或调试开发的Android APP。 2.adb的windows下载安装路径&#xff1a;SDK 平台工具版本说明 | Android 开发者 | Android Developers 3.linux中安装adb,参考该链接&#xff1a; https://www.cnblogs.com/androidsu…

【OSPF Loading、FULL状态与display ospf peer brief命令、OSPF的数据库讲解】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️ 零基…

(Python)使用Matplotlib将x轴移动到绘图顶部

移动前&#xff1a; 我们有两种方法可以实现这个目标&#xff1a; import warnings warnings.filterwarnings(ignore)import numpy as np import matplotlib.pyplot as pltcolumn_labels list(ABCD) row_labels list(WXYZ)data np.random.rand(4, 4)fig, ax plt.subplots(…

32 数据分析(下)pandas介绍

文章目录 工具excelTableauPower Queryjupytermatplotlibnumpypandas数据类型Series基础的SeriesSeries的字典操作增加表的索引名字和表名字索引操作 DataFrameDataFrame 的基础使用DataFrame的列方法------理解DataFrame的行列方法------使用loc 与 iloc 对齐操作SeriesDataFr…

gitlab自编译 源码下载

网上都是怎么用 gitlab&#xff0c;但是实际开发中有需要针对 gitlab 进行二次编译自定义实现功能的想法。 搜索了网上的资料以及在官网的查找&#xff0c;查到了如下 gitlab 使用 ruby 开发。 gitlab 下载包 gitlab/gitlab-ce - Packages packages.gitlab.com gitlab/gitl…

Excel冻结窗格

1、冻结表格首行 点击菜单栏中的“视图”&#xff0c;选择“窗口”选项卡中的“冻结窗格”下的小三角&#xff0c;再选择“冻结首行”&#xff1b; 2.冻结表格首列 点击菜单栏中的“视图”&#xff0c;选择“窗口”选项卡中的“冻结窗格”下的小三角&#xff0c;再选择“冻结…

linux性能分析(二)如何从日志分析 PV、UV

一 如何从日志分析 PV、UV 本文是从业务侧来衡量整个应用系统的性能,区别与上篇的网络性能分析备注&#xff1a; 这里的日志不仅指的是业务类型日志,也包括系统日志等各种类型的日志关键&#xff1a; 掌握PV和UV的概念和度量方式 "以下是关于埋点的科普文章" 埋…

gcc编译器和gdb调试工具

gcc编译器 GCC&#xff08;GNU Compiler Collection&#xff09;是一套由GNU计划开发的自由软件编译器集合&#xff0c;它支持多种编程语言&#xff0c;包括C、C、Objective-C、Fortran、Ada和Go等。GCC 是一个功能强大、稳定可靠的编译器&#xff0c;被广泛应用于各种操作系统…

jmeter(三十三):阶梯线程组Stepping Thread Group,并发线程Concurrency Thread Group

Stepping Thread Group参数详解 this group will start:表示总共要启动的线程数;若设置为 100,表示总共会加载到 100 个线程first,wait for:从运行之后多长时间开始启动线程;若设置为 0 秒,表示运行之后立即启动线程then start:初次启动多少个线程;若设置为 0 个,表示…

DH48WK 温控器参数设置

北京东昊力伟科技有限责任公司 温控仪、温度控制器 产品特点&#xff1a; 可外接温度传感器Pt100、Cu50、K、E、J、N、T、R、S、B兼容输入&#xff1b;PID控制输出、位式控制输出、继电器报警输出&#xff1b;控温能满足设定温度值的0.2℃&#xff1b;既可用于加热控制、也可…

通讯协议学习之路:USART协议理论

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 一、…

易点易动设备管理系统:提升生产企业设备保养效率的利器

在现代生产企业中&#xff0c;设备保养是确保生产线稳定运行和产品质量的关键环节。然而&#xff0c;传统的设备保养方式往往面临效率低下、数据不准确等问题&#xff0c;影响了生产效率和竞争力。随着科技的进步&#xff0c;易点易动设备管理系统应运而生&#xff0c;以其智能…

短视频矩阵系统/pc、小程序版独立原发源码开发搭建上线

短视频剪辑矩阵系统开发源码----源头搭建 矩阵系统源码主要有三种框架&#xff1a;Spring、Struts和Hibernate。Spring框架是一个全栈式的Java应用程序开发框架&#xff0c;提供了IOC容器、AOP、事务管理等功能。Struts框架是一个MVC架构的Web应用程序框架&#xff0c;用于将数…

【算法训练-排序算法 三】【排序应用】合并区间

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【合并区间】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

05在IDEA中配置Maven的基本信息

配置Maven信息 配置Maven家目录 每次创建Project工程后都需要设置Maven家目录位置&#xff0c;否则IDEA将使用内置的Maven核心程序和使用默认的本地仓库位置 一般我们配置了Maven家目录后IDEA就会自动识别到conf/settings.xml配置文件和配置文件指定的本地仓库位置创建新的P…

6-8 舞伴问题 分数 15

void DancePartner(DataType dancer[], int num) {LinkQueue maleQueue SetNullQueue_Link();LinkQueue femaleQueue SetNullQueue_Link();// 将男士和女士的信息分别加入对应的队列for (int i 0; i < num; i) {if (dancer[i].sex M){EnQueue_link(maleQueue, dancer[i]…

vim、gcc/g++、make/Makefile、yum、gdb

vim、gcc/g、make/Makefile、yum、gdb 一、Linux编辑器vim1、简介2、三种模式的概念&#xff08;1&#xff09;正常/普通/命令模式(Normal mode)&#xff08;2&#xff09;插入模式(Insert mode)&#xff08;3&#xff09;末行/底行模式(last line mode) 3、三种模式的切换4、正…

SLAM从入门到精通(bresenham绘制算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;学术界和工业界对于slam的要求是不一样的。前者要求robot在运动的过程中&#xff0c;同步实现定位和制图的操作。但是工业…