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.hqwc.cn/news/139191.html

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

相关文章

WebSocket学习笔记

一篇文章理解WebSocket原理 1.HTTP协议(半双工通信)&#xff1a; HTTP是客户端向服务器发起请求&#xff0c;服务器返回响应给客户端的一种模式。 特点&#xff1a; 1.只能是客户端向服务器发起请求&#xff0c;是单向的。 2.服务器不能主动发送数据给客户端。 半双工通信…

二叉树的最小深度(rust实现)

二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 思路 这道题本质上是考察&#xff1a; 如何遍历二叉树理解什么是深度 对于这两点的考察&am…

欧盟反垄断法的改变:对跨境电商的冲击和机遇

2024年&#xff0c;欧盟反垄断法将经历一场革命性的改变&#xff0c;这对于跨境电商来说是一个重大的法规转折点。长达数十年的联合体集体豁免条例&#xff08;CBER&#xff09;即将失效。 这意味着货运公司将不再享受欧盟针对反竞争协议规则的特殊待遇。这一法规的变革将对跨…

探索低代码技术

低/无代码的高速发展&#xff0c;属于软件市场的选择&#xff0c;相较于传统编写代码的开发方式&#xff0c;低/无代码开发效率高、投入成本低、技术门槛也更低&#xff0c;未来更多软件应用将使用低/无代码技术完成&#xff0c;这也是趋势。 身为开发人员经常需要花大量时间在…

智慧公厕管理系统:科技赋能城市公共卫生服务的便利

在现代社会的城市化进程中&#xff0c;公共设施的管理变得越来越重要。而公厕作为城市公共设施的重要组成部分&#xff0c;也需要借助科技的力量进行管理和监控。智慧公厕管理系统应运而生&#xff0c;它为公厕管理人员提供了实时监控和数据统计分析的功能&#xff0c;大大提高…

Nginx正向代理,反向代理,负载均衡

Nginx正向代理&#xff0c;反向代理&#xff0c;负载均衡 Nginx当中有两种代理方式&#xff1a; 七层代理&#xff08;http协议&#xff09; 四层代理&#xff08;tcp/udp流量转发&#xff09; 七层代理&#xff1a;七层代理&#xff0c;代理的是http的请求和响应 客户端请求…

安防监控系统EasyCVR视频汇聚平台设备树收藏按钮的细节优化

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#…

推动产业升级及创新,Doris Summit Asia 2023 先进智造与电信论坛提前揭秘

峰会官网已上线&#xff0c;最新议程请关注&#xff1a;doris-summit.org.cn 即刻报名 Doris Summit 是 Apache Doris 社区一年一度的技术盛会&#xff0c;由飞轮科技联合 Apache Doris 社区的众多开发者、企业用户和合作伙伴共同发起&#xff0c;专注于传播推广开源 OLAP 与…

文档外发控制与安全:实现高效协作与数据安全的关键

随着企业数据量的不断增加&#xff0c;文档外发成为了一个不可避免的需求。然而&#xff0c;很多企业在文档外发过程中存在着很多问题&#xff0c;如数据泄露、信息误用等。因此&#xff0c;如何保证文档外发的安全性和高效性成为了企业亟待解决的问题。飞驰云联Ftrans的文件收…

[Linux c/c++] futex

参考&#xff1a; Pthread locks: Mutex vs Spilocks vs Futex – Deep Code DiveLocking During multi-threading or multi-processing, the biggest challenge is selecting types of locks. When writing C code, one can manually write their own locking mechanism or c…

低学历可以学python吗?

低学历可以学python吗&#xff1f; 看不到前途&#xff0c;是不是自己对以后工作就业的事情感到比较迷茫呢&#xff1f; 是不知道企业要求哪些知识&#xff0c;想要的是什么样能力的人&#xff1f; 最近很多小伙伴找我&#xff0c;说想要一些c语言资料&#xff0c;然后我根据…

Leetcode刷题详解——找到字符串中所有字母异位词

1. 题目链接&#xff1a;438. 找到字符串中所有字母异位词 2. 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括…