当前位置: 首页 > news >正文

Spring《三》DI依赖注入

🍎道阻且长,行则将至。🍓

上一篇:Spring《二》bean的实例化与生命周期
下一篇:敬请期待

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述


目录

  • 一、setter注入🍉
    • 1.注入引用数据类型
    • 2.注入简单数据类型
  • 二、构造器注入🍊
    • 1.注入引用数据类型
    • 2.简单数据类型
  • 三、自动配置🍇
    • 1.自动装配方式
    • 2.自动装配的配置
        • 2.1 按类型注入
        • 2.2 按名称注入
    • 3.集合类型注入


向一个类中传递数据的方式有:普通方法(set方法)构造方法。Spring就相对应地为我们提供了两种注入方式:setter注入构造器注入。同时也包括简单类型和引用类型(对象)注入。

*setter方法构造器
引用类型类中添加setter方法,配置文件使用property,ref=引用对象类中添加构造器方法,配置文件使用constructor-arg,ref=引用对象
基本类型类中添加setter方法,配置文件使用property,value=值类中添加构造器方法,配置文件使用constructor-arg,value=值

一、setter注入🍉

在Spring入门篇中进行的DI依赖注入就是setter方法。

我们先创建好Maven项目,和上一篇类似,添加好项目依赖,添加Spring配置文件。在项目中添加BookDao、BookDaoImpl、UserDao、UserDaoImpl、BookService和BookServiceImpl类以及AppForDISet运行类。

public class AppForDISet {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("mySpringSetFile.xml");BookService bookService = (BookService) ctx.getBean("bookService");bookService.save();}
}

1.注入引用数据类型

bookServiceImpl对象中注入bookDao userDao

  1. 在BookServiceImpl中声明属性并提供setter方法,同时在save方法中调用他们俩的save
public class BookServiceImpl implements BookService{private BookDao bookDao;private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}public void save() {System.out.println("book service save ...");bookDao.save();userDao.save();}
}
  1. 在配置文件中使用property进行注入配置
<bean id="bookService"class="Demo.Srevice.impl.BookServiceimpl"><property name="bookDao" ref="bookDao"/><property name="userDao" ref="userDao"/>
</bean>
  1. 运行,注入成功
    在这里插入图片描述

2.注入简单数据类型

BookDaoImpl注入一些简单数据类型的数据。

  1. 声明属性并提供setter方法
private String databaseName;
private int connectionNum;
public void setDatabaseName(String databaseName) {this.databaseName = databaseName;
}
public void setConnectionNum(int connectionNum) {this.connectionNum = connectionNum;
}
  1. 在配置文件中使用property注入
<bean id="bookDao" class="Demo.Srevice.impl.BookServiceimpl"><property name="databaseName" value="mysql"/><property name="connectionNum" value="10"/>
</bean>
  1. 修改一下这个类的save方法:System.out.println("Book dao save ..."+databaseName+":"+connectionNum);
  2. 运行,注入成功:
    在这里插入图片描述

二、构造器注入🍊

构造方法注入

可以继续使用前面的案例,将前面的注入删除或者注释掉。

1.注入引用数据类型

BookServiceImpl类中的bookDao userDao修改成使用构造器的方式注入。使用快捷键alt+insert吧:
在这里插入图片描述
在这里插入图片描述

public BookServiceimpl(BookDao bookdao, UserDao userDao) {this.bookdao = bookdao;this.userDao = userDao;
}

在Spring配置文件里配置构造方式注入

    <bean id="bookService" class="Demo.Srevice.impl.BookServiceimpl">
<!--        <property name="bookdao" ref="bookDao"/>-->
<!--        <property name="userDao" ref="userDao"/>--><constructor-arg name="bookdao" ref="bookDao"/><constructor-arg name="userDao" ref="userDao"/></bean>

注入成功:
在这里插入图片描述

注意这种方法在构造器和配置文件中的参数顺序不能乱,交换两个参数前后位置会提示警告:
在这里插入图片描述

    <bean id="bookService" class="Demo.Srevice.impl.BookServiceimpl">
<!--        <property name="bookdao" ref="bookDao"/>-->
<!--        <property name="userDao" ref="userDao"/>--><constructor-arg name="userDao" ref="userDao"/><constructor-arg name="bookdao" ref="bookDao"/></bean>

在这里插入图片描述

Error creating bean with name ‘bookService’ defined in class path resource [mySpringSetFile.xml]: Unsatisfied dependency expressed through constructor parameter 0: Could not convert argument value of type [Demo.Dao.impl.UserDaoimpl] to required type [Demo.Dao.BookDao]: Failed to convert value of type ‘Demo.Dao.impl.UserDaoimpl’ to required type ‘Demo.Dao.BookDao’; nested exception is java.lang.IllegalStateException: Cannot convert value of type ‘Demo.Dao.impl.UserDaoimpl’ to required type ‘Demo.Dao.BookDao’: no matching editors or conversion strategy found

2.简单数据类型

修改BookDaoImpl类,添加构造方法:

public BookDaoImpl(String databaseName, int connectionNum) {this.databaseName = databaseName;this.connectionNum = connectionNum;
}

修改配置文件:

<bean id="bookDao" class="Demo.Dao.impl.BookDaoimpl"><constructor-arg name="databaseName" value="mysql"/><constructor-arg name="connectionNum" value="666"/>
<!--        <property name="databaseName" value="mysql"/>-->
<!--        <property name="connectionNum" value="10"/>-->
</bean>

构造函数中方法的参数名发生变化后,配置文件中的name属性也需要跟着变,为了避免这种情况,可以选择type或者index:
在这里插入图片描述

根据数据类型:

<bean id="bookDao" class="Demo.Dao.impl.BookDaoimpl"><constructor-arg type="int" value="10"/><constructor-arg type="java.lang.String" value="mysql"/>
<!--        <property name="databaseName" value="mysql"/>-->
<!--        <property name="connectionNum" value="10"/>-->
</bean>

根据参数位置:

<bean id="bookDao" class="Demo.Dao.impl.BookDaoimpl"><constructor-arg index="0" value="mysql"/><constructor-arg index="1" value="10"/>
<!--        <property name="databaseName" value="mysql"/>-->
<!--        <property name="connectionNum" value="10"/>-->
</bean>

运行注入成功:
在这里插入图片描述

同样的对于使用name的方法不能交换参数位置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
错误的把配置文件中第一个参数给了构造器第一个参数。

三、自动配置🍇

前面的Spring注入方法仍然很麻烦,Spring提供了自动配置方法。就是IOC容器根据bean所依赖的资源在容器中自动查找并注入到bean中。用于引用类型依赖注入,不能对简单类型进行操作

1.自动装配方式

1.按类型(常用)byType
2.按名称byName
3.按构造方法constructor
4.不启用自动装配no
在这里插入图片描述

2.自动装配的配置

再次把前面案例的注入删除。在<bean>中添加autowire属性。

2.1 按类型注入

<bean id="bookService" class="Demo.Srevice.impl.BookServiceimpl" autowire="byType"/>

1.需要注入属性的类中对应属性的setter方法不能省略。
2.被注入的对象必须要被Spring的IOC容器管理。
3.按照类型在Spring的IOC容器中如果找到多个对象,会报NoUniqueBeanDefinitionException

2.2 按名称注入

如果一个类型在IOC中有多个对象,这个时候就需要按照名称注入(变量名与配置耦合,不推荐使用):

<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byName"/>

按照名称去找对应的bean对象,找不到则注入Null。
自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效。

3.集合类型注入

bean中使用property,根据集合类型:数组、List、Set、Map、Properties设置name参数。
3.1 注入数组类型数据

<property name="array"><array><value>100</value><value>200</value><value>300</value></array>
</property>

3.2 注入List类型数据

<property name="list"><list><value>itcast</value><value>itheima</value><value>boxuegu</value><value>chuanzhihui</value></list>
</property>

List的底层也是通过数组实现的,所以<list><array>标签是可以混用。

3.3 注入Set类型数据

<property name="set"><set><value>itcast</value><value>itheima</value><value>boxuegu</value><value>boxuegu</value></set>
</property>

3.4 注入Map类型数据

<property name="map"><map><entry key="country" value="china"/><entry key="province" value="henan"/><entry key="city" value="kaifeng"/></map>
</property>

3.5 注入Properties类型数据

<property name="properties"><props><prop key="country">china</prop><prop key="province">henan</prop><prop key="city">kaifeng</prop></props>
</property>

3.6 property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array><list><set><map><props>标签。
集合中要添加引用类型,只需要把<value>标签改成<ref>标签。


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

相关文章:

Spring《三》DI依赖注入

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 上一篇&#xff1a;Spring《二》bean的实例化与生命周期 下一篇&#xff1a;敬请期待 目录一、setter注入&#x1f349;1.注入引用数据类型2.注入简单数据类型二、构造器注入&#x1f34a;1.注入引用数据类型2.简单数…...

leetcode 面试题 17.06. 2出现的次数

编写一个方法&#xff0c;计算从 0 到 n (含 n) 中数字 2 出现的次数。 示例: 输入: 25 输出: 9 解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 应该算作两次) 该问题用的方法数数组dp&#xff0c;首先我通过总结规律写出了相关的code。使用一个dp数组记录10i10^i10i以内会出…...

CMake入门教程【基础篇】5.configure_file构建配置

configure_file配置文件 文章目录 知识点实例代码目录代码实现知识点 configure_fileconfigure_file 源文件转换为目标文件 实例 代码目录 |-📁prj4   |-- 🎴CMakeLists.txt   |-- 🎴TutorialConfig.h.in   |-- 🎴tutorial.cxx 代码实现 /prj4/CMakeLists.…...

软件开发可行性分析——健康食谱小程序

关于软件开发可行性分析先给大家介绍下面几个关键点&#xff1a; 什么是可行性分析&#xff1f; 检查并确定是否值得为项目或产品投入时间、金钱和资源。这样的评估活动称为“可行性分析”。 为什么要进行可行性分析&#xff1f; 在软件项目开发过程中&#xff0c;只要资源…...

ShuffleNet V1 对花数据集训练

目录 1. shufflenet 介绍 分组卷积 通道重排 2. ShuffleNet V1 网络 2.1 shufflenet 的结构 2.2 代码解释 2.3 shufflenet 代码 3. train 训练 4. Net performance on flower datasets 1. shufflenet 介绍 shufflenet的亮点&#xff1a;分组卷积 通道重排 mobilenet …...

测试人员转型是大势所趋:我的10年自动化测试经验分享

做测试十多年&#xff0c;有不少人问过我下面问题&#xff1a; 现在的手工测试真的不行了吗&#xff1f; 测试工程师&#xff0c;三年多快四年的经验&#xff0c;入门自动化测试需要多久&#xff1f; 自学自动化测试到底需要学哪些东西&#xff1f; 不得不说&#xff0c;随着行…...

Pandas高级操作,建议收藏(一)

在数据分析和数据建模的过程中需要对数据进行清洗和整理等工作&#xff0c;有时需要对数据增删字段。下面为大家介绍Pandas对数据的复杂查询、数据类型转换、数据排序的使用。 复杂查询 实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据,接下来为大家介绍如何…...

ASIC-WORLD Verilog(1)一日Verilog

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加了自己的理解&#xff09;分享给大家。 这是网站原文&…...

数据治理工具项目投标书技术部分-V1.6

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 项目背景 二、项目目标 提供一套后勤数据治理工具部署文件及配套文档&#xff0c;主要技术指标如下&#xff1a; &#xff08;1&#xff09;具备数据抽取转换装载、元数据管理、…...

ARMv8如何读取cache line中MOESI 状态以及Tag信息(tag RAM dirty RAM)

本文以Cortex-A53处理器为例&#xff0c;通过访问 处理器中的内部存储单元&#xff08;tag RAM和dirty RAM&#xff09;&#xff0c;来读取cache line 中的MOESI信息。 Cortex-A53提供了一种通过读取一些系统寄存器&#xff0c;来访问Cache 和 TLB使用的一些内部存储单元的机制…...

学习通学习--脚本

刷客就爱学学习-首页 (xxbwk.top) 所有科目答案可以网上找超星尔雅学习通《形势与政策》2023年春章节测试答案 (3gmfw.cn) 学习通全部答案 萌面人 – 萌面人官网 (mengmianren.com) 自动答题教程 想要使用自动答题功能&#xff0c;只需要一个配置项就可以让OCS脚本拥有自动答…...

C盘的深度清理

随着反复安装和移除软件&#xff0c;c盘虽然给了80或者100G的空间&#xff0c;也经不住垃圾文件的堆积。居然只剩下几兆空间了。真是可气&#xff0c;某些软件虽然移除了。但是他们不负责自己产生的文件夹和文件的深度清理。 1. 清理系统的垃圾 2. 移动或者清理大文件。 某…...

43掌握自动化运维工具 Puppet 的基本用法,包括模块编写、资源管理

Puppet是一种自动化配置管理工具&#xff0c;可以自动化地部署、配置和管理大规模服务器环境。本教程将介绍Puppet的基本用法&#xff0c;包括模块编写和资源管理。 模块编写 在Puppet中&#xff0c;模块是一组相关的类、文件和资源的集合。模块可以用于部署和配置应用程序、服…...

【新2023Q2押题JAVA】华为OD机试 - 硬件产品销售方案

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:硬件产品销售方案 题目描述 …...

three.js实现3d球体树状结构布局——树状结构的实现

目录系列文章安装依赖基本分析实体类场景相机渲染器辅助线环境光点光源球形几何体球形几何体的材质线几何体线几何体的材质物体文本轨道控制实现效果实现源码参考文档系列文章 three.js实现3d球体树状结构布局——添加入场、出场、点击放大等动画 安装依赖 npm i three three…...

ChatGPT大解密:带您探讨机器学习背后的秘密、利用与发展

一、什么是机器学习&#xff1f;二、ChatGPT 的运作原理三、ChatGPT 生活利用1、自然语言处理2、翻译3、自动回复四、ChatGPT vs 其他相关技术五、ChatGPT 的未来1、未来发展2、职业取代3、客服人员4、翻译人员5、语言学家6、机遇与挑战六、结语这篇文章&#xff0c;将带着各位…...

3ds max2024带来了什么新功能(一)

文章目录1、安装2、操作界面3、快捷键&#xff08;不冲突了&#xff09;4、 修改器列表&#xff08;可以搜索了&#xff09;5、超级阵列功能&#xff08;Array&#xff09;6、超级布尔1、安装 传说3dmax2024有很多牛叉的改进二话不说&#xff0c;先安装按起来&#xff01;这个…...

HNU-电路与电子学-实验3

实验三 模型机组合部件的实现&#xff08;二&#xff09;&#xff08;实验报告格式案例&#xff09; 班级 计XXXXX 姓名 wolf 学号 2021080XXXXX 一、实验目的 1&#xff0e;了解简易模型机的内部结构和工作原理。 2&#xff0e;分析模型机的功能&am…...

Hadoop MapReduce各阶段执行过程以及Python代码实现简单的WordCount程序

视频资料&#xff1a;黑马程序员大数据Hadoop入门视频教程&#xff0c;适合零基础自学的大数据Hadoop教程 文章目录Map阶段执行过程Reduce阶段执行过程Python代码实现MapReduce的WordCount实例mapper.pyreducer.py在Hadoop HDFS文件系统中运行Map阶段执行过程 把输入目录下文件…...

GitLab CI/CD 新书发布,助企业降本增效

前言 大家好&#xff0c;我是CSDN的拿我格子衫来&#xff0c; 昨天我的第一本书《GitLab CI/CD 从入门到实战》上架啦&#xff0c;这是业内第一本详细讲解GitLab CI/CD的书籍。 历经无数个日夜&#xff0c;最终开花结果。感触良多&#xff0c;今天就借这篇文章来谈一谈这本书的…...

【分享】如何写出整洁的代码?

文章目录前言1.为什么要保持代码整洁?1.1 所以从一开始就要保持整洁1.2 如何写出整洁的代码?2.命名3.类3.1单一职责3.2 开闭原则3.3 内聚4.函数4.1 只做一件事4.2 函数命名4.3 参数4.4 返回值4.5 怎样写出这样的函数?4.6 代码质量扫描工具5.测试5.1 TDD5.2 FIRST原则5.3 测试…...

视频剪辑:教你如何调整视频画面的大小。

大家应该都会调整图片的大小吧&#xff0c;那你们会调整视频画面的大小吗&#xff1f;我想&#xff0c;应该会有人不还不知道要调整的吧&#xff0c;今天就让小编来教大家一个方法怎样去调整视频画面的大小尺寸。 首先&#xff0c;我们要有以下材料&#xff1a; 一台电脑 【…...

操作系统概述

Overview Q1&#xff08;Why&#xff09;:为什么要学操作系统&#xff1f;Q2&#xff08;What&#xff09;&#xff1a;到底什么是操作系统&#xff1f;Q3&#xff08;How&#xff09;&#xff1a;怎么学操作系统&#xff1f; 一.为什么要学操作系统&#xff1f; 学习操作系统…...

记录重启csdn

有太多收藏的链接落灰了&#xff0c;在此重启&#xff5e; 1、社会 https://mp.weixin.qq.com/s/Uq0koAbMUk8OFZg2nCg_fg https://mp.weixin.qq.com/s/yCtLdEWSKVVAKhvLHxjeig https://zhuanlan.zhihu.com/p/569162335?utm_mediumsocial&utm_oi938179755602853888&ut…...

蓝牙耳机哪个品牌质量最好最耐用?蓝牙耳机排行榜10强推荐

现今&#xff0c;外出佩戴蓝牙耳机的人越来越多&#xff0c;各大品牌厂商对于蓝牙耳机各种性能的设计也愈发用心。那么&#xff0c;无线耳机哪个品牌音质好&#xff1f;下面&#xff0c;我来给大家推荐几款质量好的无线蓝牙耳机&#xff0c;可以当个参考。 一&#xff0e;南卡…...

mysql 双主架构详解

文章目录 一、背景二、MySQL双主(主主)架构方案三、MySQL双主架构图四、MySQL双主架构的优缺点五、MySQL双主架构,会存在什么问题?总结一、背景 MySQL 主从模式优缺点 容灾:主数据库宕机后,启动从数据库,用于故障切换 备份:防止数据丢失 读写分离:主数据库可以只负责…...

计算机指令系统基础 - 寻址方式详解

文章目录1 概述2 常见寻址方式2.1 立即寻址2.2 直接寻址2.3 间接寻址2.4 寄存器寻址2.5 寄存器间接寻址2.6 相对寻址2.7 变址寻址3 扩展3.1 操作码3.2 常见寄存器1 概述 计算机指令&#xff1a;指挥计算机工作的 指示 和 命令内容&#xff1a;通常一条 指令 包括两方面的内容 …...

React Three Fiber动画入门

使用静态对象和形状构建 3D 场景非常酷&#xff0c;但是当你可以使用动画使场景栩栩如生时&#xff0c;它会更酷。 在 3D 世界中&#xff0c;有一个称为角色装配的过程&#xff0c;它允许你创建称为骨架的特殊对象&#xff0c;其作用类似于骨骼和关节系统。 这些骨架连接到一块…...

为什么我推荐你使用 systemd timer 替代 cronjob?

概述 前几天在使用 Terraform cloud-init 批量初始化我的实验室 Linux 机器。正好发现有一些定时场景需要使用到 cronjob, 进一步了解到 systemd timer 完全可以替换 cronjob, 并且 systemd timer 有一些非常有趣的功能。 回归话题&#xff1a;为什么我推荐你使用 systemd t…...

elasticsearch基础6——head插件安装和web页面查询操作使用、ik分词器

文章目录一、基本了解1.1 插件分类1.2 插件管理命令二、分析插件2.1 es中的分析插件2.1.1 官方核心分析插件2.1.2 社区提供分析插件2.2 API扩展插件三、Head 插件3.1 安装3.2 web页面使用3.2.1 概览页3.2.1.1 unassigned问题解决3.2.2 索引页3.2.3 数据浏览页3.2.4 基本查询页3…...