Spring框架--Spring入门实验二之依赖注入

目录

引言

1、依赖注入之setter注入

2、依赖注入之构造器注入

3、为类类型属性赋值(依赖注入之对象注入)

4、为数组类型属性赋值


引言

Spring框架中的依赖注入(Dependency Injection,DI)是一种设计模式和编程实践,它通过反转控制(Inversion of Control, IoC)实现组件之间的解耦。在传统的对象创建过程中,一个类通常需要自己创建并管理对其他类的引用,这会导致高度耦合。而依赖注入则是由一个第三方容器(IOC容器)负责创建对象,并将这些对象所依赖的对象实例作为构造函数参数、setter方法或字段直接注入到目标对象中。

在Spring框架中,依赖注入可以通过构造函数注入、Setter方法注入或字段注入来实现。通过依赖注入,开发人员可以将对象之间的依赖关系配置在Spring容器中,然后由Spring容器在运行时动态地将依赖关系注入到对象中,从而实现对象之间的解耦和灵活的管理。这样可以使得代码更加模块化和易于扩展,同时也方便进行单元测试和集成测试。

1、依赖注入之setter注入

①创建学生类Student

public class Student {private Integer id;private String name;private Integer age;private String sex;public Student() {}public Integer getId() { return id;}public void setId(Integer id) { this.id = id;}public String getName() { return name;}public void setName(String name) { this.name = name;}public Integer getAge() { return age;}public void setAge(Integer age) { this.age = age;}public String getSex() { return sex;}public void setSex(String sex) { this.sex = sex;}@Overridepublic String toString() { return "Student{" + "id=" + id + ", name='" + name + ", age=" + age + ", sex='" + sex }';}
}

②配置bean时为属性赋值

property标签就是通过组件类的setXxx()方法给对象设置属性,在运行时容器会动态地将依赖关系注入到对象。

<bean id="studentOne" class="com.softeem.bean.Student"><!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 --><!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关)--><!-- value属性:指定属性值 --><property name="id" value="1001"></property><property name="name" value="张三"></property><property name="age" value="23"></property><property name="sex" value="男"></property>
</bean>

③测试

getBean()方法里面的参数一定要配置文件中bean标签中的id一致

@Test
public void studentTest(){ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");Student student = ac.getBean("studentOne", Student.class);System.out.println("student = " + student);
}

2、依赖注入之构造器注入

①在Student类中添加有参构造

public Student(Integer id, String name, Integer age, String sex) { this.id = id;this.name = name; this.age = age; this.sex = sex;
}

②配置bean

 <bean id="studentTwo" class="com.softeem.bean.Student"><constructor-arg value="1002"></constructor-arg><constructor-arg value="李四"></constructor-arg><constructor-arg  value="33"></constructor-arg><constructor-arg  value="女"></constructor-arg></bean>

注意:

constructor-arg标签还有两个属性可以进一步描述构造器参数:

index属性:指定参数所在位置的索引(从0开始)

name属性:指定参数名

③测试

@Test
public void testDIBySet(){ApplicationContext ac = new ClassPathXmlApplicationContext("spring-di.xml"); Student studentOne = ac.getBean("studentTwo", Student.class); System.out.println(studentOne);
}

3、为类类型属性赋值(依赖注入之对象注入)

①创建班级类Clazz

public class Clazz {private Integer clazzId;private String clazzName;public Integer getClazzId() { return clazzId;}    public void setClazzId(Integer clazzId) { this.clazzId = clazzId;}public String getClazzName() { return clazzName;}public void setClazzName(String clazzName) { this.clazzName = clazzName;}@Overridepublic String toString() { return "Clazz{" +"clazzId=" + clazzId +", clazzName='" + clazzName + '}';}public Clazz() {}public Clazz(Integer clazzId, String clazzName) { this.clazzId = clazzId;this.clazzName = clazzName;}
}

②修改Student类

在Student类中添加班级类属性及get、set方法。

为类类型属性赋值方式一:引用外部已声明的bean

配置Clazz类型的bean:

<bean id="clazzOne" class="com.softeem.bean.Clazz"><property name="clazzId" value="1111"></property><property name="clazzName" value="财源滚滚班"></property>
</bean>

为Student中的clazz属性赋值:

<bean id="studentFour" class="com.softeem.spring.bean.Student"><property name="id" value="1004"></property><property name="name" value="赵六"></property><property name="age" value="26"></property><property name="sex" value="女"></property><!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 --><property name="clazz" ref="clazzOne"></property>
</bean>

<property name="clazz" ref="clazzOne"></property> 就是property为clazz属性赋值,但此处不能用value进行赋值而要使用ref,对Clazz类型的bean参考。可以看到ref属性的值就是Clazz类型bean的id。

为类类型属性赋值方式二:内部bean

<bean id="studentFour" class="com.softeem.bean.Student"><property name="id" value="1004"></property><property name="name" value="赵六"></property><property name="age" value="26"></property><property name="sex" value="女"></property><property name="clazz"><!-- 在一个bean中再声明一个bean就是内部bean --><!-- 内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性 --><bean class="com.softeem.bean.Clazz"><property name="clazzId" value="2222"></property><property name="clazzName" value="远大前程班"></property></bean></property>
</bean>

为类类型属性赋值方式三:级联属性赋值(用的极少)

<bean id="studentFour" class="com.softeem.spring.bean.Student"><property name="id" value="1004"></property><property name="name" value="赵六"></property><property name="age" value="26"></property><property name="sex" value="女"></property><!-- 一定先引用某个bean为属性赋值,才可以使用级联方式更新属性 --><property name="clazz" ref="clazzOne"></property><property name="clazz.clazzId" value="3333"></property><property name="clazz.clazzName" value="最强王者班"></property>
</bean>

4、为数组类型属性赋值

这个简单,只用在property标签中增加array标签即可,然后在value属性赋值:

<property name="hobbies"><array><value>抽烟</value><value>喝酒</value><value>烫头</value></array>
</property>

综上就是Spring框架中IOC容器依赖注入的几种方法。

spring框架概述及第一个入门实验见作者spring框架专栏中https://blog.csdn.net/m0_66111719/article/details/135839708?spm=1001.2014.3001.5501

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

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

相关文章

前端JavaScript篇之intanceof 操作符的实现原理及实现、为什么0.1+0.2 ! == 0.3,如何让其相等

目录 intanceof 操作符的实现原理及实现为什么0.10.2 ! 0.3&#xff0c;如何让其相等 intanceof 操作符的实现原理及实现 instanceof 是一个用于检查对象是否属于特定类的 JavaScript 操作符。它返回一个布尔值&#xff0c;指示对象是否是特定类的实例或者原型链中是否存在该…

Tensorflow 中的损失函数 —— loss 专题汇总

回归和分类是监督学习中的两个大类。自学过程中&#xff0c;阅读别人代码时经常看到不同种类的损失函数&#xff0c;到底 Tensorflow 中有多少自带的损失函数呢&#xff0c;什么情况下使用什么样的损失函数&#xff1f;这次就来汇总介绍一下。 一、处理回归问题 1. tf.losses…

Vue组件点击事件不触发的问题,添加事件修饰符native解决

目录 一、父组件在子组件上绑定方法&#xff0c;点击不触发 .native是什么&#xff1f; 二、其他事件修饰符 .stop .prevent .capture .self .once .passive 三、子组件触发父组件方法 四、父组件调用子组件方法 一、父组件在子组件上绑定方法&#xff0c;点击不触发…

常见の算法

前言本文主要使用Java 什么&#xff0c;是快乐星球#&#xffe5;%……什么是算法&#xff1f; 算法是一组完成任务的指令。任何代码片段都可视为算法&#xff0c;但我们主要介绍常见算法 一、引入——二分查找 二分查找是一种算法&#xff0c;其输入是一个有序的元素列表。如…

java获取一段音频/mp3的时长

引言 在日常开发中&#xff0c;经常会遇到产品经理提出一个需求“上传音乐/音频”&#xff0c;而且还得显示出音频的播放时长。那我们直接世界上最简单的实现方案&#xff0c;必须是最简单&#xff0c;多一句啰嗦不准点赞。 How to do 1.提前引入包 <!--视频多媒体工具包…

浏览器实用:禁止浏览器http自动转成https

前言 因为有些网站支持http和https两种协议访问&#xff0c;有些只支持一种协议访问。但根据动态域名安全策略&#xff08;HSTS&#xff09;&#xff0c;只要该域名在浏览器中访问过一次https&#xff0c;那么浏览器将强制使http的请求变为https。 虽然这条浏览器的策略有利于提…

【oshi-core依赖】Java获取计算机的内存信息、磁盘信息、CPU信息

这篇文章,主要介绍Java如何获取计算机内存信息、磁盘信息、CPU信息【知识星球】。 目录 一、获取系统信息 1.1、引入依赖 1.2、SystemInfo类

Flink入门教程

使用flink时需要提前准备好scala环境 一、创建maven项目 二、添加pom依赖 <properties><scala.version>2.11.12</scala.version></properties><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library<…

【蓝桥备赛】最大数组和——前缀和

题目链接 最大数组和 个人思路 一个需要简单操作的前缀和数组&#xff0c;因为需要对价值最大的宝石和价值最小的宝石进行操作&#xff0c;所以肯定少不了进行一个排序。然后&#xff0c;可能就有人想要不使用双指针进行处理&#xff0c;如果最小的两个数之和大于最大的数&a…

携程基于Jira Cloud的敏捷项目管理实践

好的工具可以满足团队在各个成长阶段的管理诉求 实践一&#xff1a;对齐目标/团队OKR/多团队协作战略项目 实践二&#xff1a;以产品为中心的协作框架 实践三&#xff1a;交付团队管理 实践四&#xff1a;和海外子公司对齐&#xff0c;协作

在linux、window环境搭建kafka环境

一、搭建环境前置准备 下载kafka的官网 http://kafka.apache.org/downloads根据自己的需求选择版本,安装包不区分linux和windows环境,这一个安装包均可部署。 源代码包含kafka的代码文件,使用scala编写的。 二、linux环境 1. 上传安装包 我下载的版本是kafka_2.12-3.6.1…

09.Elasticsearch应用(九)

Elasticsearch应用&#xff08;九&#xff09; 1.搜索结果处理包括什么 排序分页高亮返回指定字段 2.排序 介绍 Elasticsearch支持对搜索结果排序&#xff0c;默认是根据相关度算分来排序 支持排序的字段 keyword数值地理坐标日期类型 排序语法 GET /[索引名称]/_sear…

网络协议与攻击模拟_08DHCP协议

技术学习要了解某项技术能干什么&#xff1f;它的详细内容&#xff1f;发展走向&#xff1f; 一、DHCP协议 1、DHCP基本概念 dhcp动态主机配置协议&#xff0c;广泛应用于局域网内部 主要是为客户机提供TCP/IP 参数&#xff08;IP地址、子网掩码、网关、DNS等&#xff09;…

5G赋能智慧文旅:科技与文化的完美结合,打造无缝旅游体验,重塑旅游业的未来

一、5G技术&#xff1a;智慧文旅的强大引擎 5G技术的起源可以追溯到2010年&#xff0c;当时世界各国开始意识到4G技术已经达到了瓶颈&#xff0c;无法满足日益增长的移动通信需求。2013年&#xff0c;国际电信联盟&#xff08;ITU&#xff09;成立了5G技术研究组&#xff0c;开…

超融合系统疑难故障定位与解决实践 3 例(含信创技术栈)

当 IT 系统出现故障&#xff0c;问题定位往往是运维人员最头疼的环节。尤其是超融合系统&#xff0c;由于整体涉及的技术栈比较复杂&#xff0c;且有越来越多的用户基于信创环境进行部署&#xff0c;非常考验厂商和技术人员的专业能力&#xff1a;厂商研发和售后工程师不仅应能…

[pytorch入门] 6. 神经网络

基本介绍 torch.nn&#xff1a; Containers&#xff1a;基本骨架Convolution Layers&#xff1a; 卷积层Pooling layers&#xff1a;池化层Non-linear Activations (weighted sum, nonlinearity)&#xff1a;非线性激活Normalization Layers&#xff1a;正则化层 Container…

一文讲透Excel数据如何导入到Stata?

推荐采用《Stata统计分析从入门到精通》 杨维忠、张甜 清华大学出版社“1.2.6 导入其他格式的数据文件” 的解答。 在Stata主界面选择“文件|导入”命令&#xff08;如图所示&#xff09;&#xff0c;即可看到Stata支持的其他格式的数据文件类型&#xff0c;包括Excel电子表格…

【收藏】幻兽帕鲁创建服务器教程

创建幻兽帕鲁服务器1分钟部署教程&#xff0c;阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程&#xff0c;4核16G和4核32G配置可选&#xff0c;阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程&#xff1a; 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

如何在 Linux 上安装 Docker?最权威指南来了!

docker文档&#xff1a;https://docs.docker.com/engine/ 打开docker文档 这里需要注意&#xff0c;服务器上一般是没有界面的&#xff0c;我们只需要安装docker Engine。 卸载历史版本 这一步是可选的&#xff0c;如果之前安装过旧版本的Docker&#xff0c;可以使用如下命令…

openssl3.2 - linux脚本(.sh)调用openssl命令行参数的简单确认方法

文章目录 openssl3.2 - linux脚本(.sh)调用openssl命令行参数的简单确认方法概述笔记修改openssl实现的前置条件修改debian12.4下编译好的openssl实现, 将入口参数记录下来测试效果备注补充 - 将管道文件记录到本地文件效果备注补充 - 要考虑到管道的读bug_fix - 补充-extfile时…