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

【SSM】Spring对IoC的实现方式DI详讲

控制反转的一种实现方式——依赖注入

  • 一、IoC 控制反转(Overview)
    • 依赖注入(DI)- Overview
    • 利用 IoC(控制反转)这种思想有什么好处呢?
  • 二、依赖注入的方式
    • setter 方式(xml配置中的property标签)
      • 内部Bean和外部Bean
    • 构造方式(xml配置中的constructor-arg标签)

一、IoC 控制反转(Overview)

  • 控制反转是一种设计思想,也是Spring框架的核心。反转即是指本来由用户管理Bean对象,现在由框架对其进行管理。
  • 既然交给了 Spring框架 去管理,那除了负责实例化之外,当然也负责其Bean对象生命周期
  • 既然是管理Bean对象,那创建完之后放哪托管呢?IoC 容器。
  • 既然是设计思想,那其实现方式呢?依赖注入(DI)是其一种实现方式。

有反转就有正转,正转就是指由用户去创建对象,就是去 new 啦。

依赖注入(DI)- Overview

应用程序从 IoC Container 中获取依赖的 Bean,注入到依赖的程序中,这个过程称为依赖注入(Dependency Injection,DI) 。 所以说控制反转是通过依赖注入实现的,其实它们是同一个概念的不同角度描述。通俗来说就是IoC是设计思想,DI是实现方式。

依赖注入常见的方式:

  1. 构造注入
  2. set 注入

利用 IoC(控制反转)这种思想有什么好处呢?

  1. 降低了程序的耦合度,提高了其扩展力;
  2. 达成了软件设计的七大原则中的俩:OCP(Open Close Principle)开放关闭原则:类、方法等对外开放,修改对外关闭;DIP(Dependency Inversion Principle)依赖倒置原则:通过抽象使各个类或者模块不相互影响,实现松耦合。

有关七大软件设计原则的详细介绍可以看这篇博客:

软件设计的七大原则

二、依赖注入的方式

构造方法注入、set 注入
IoC 有三种配置方式:xml配置、Java配置、注解配置。

setter 方式(xml配置中的property标签)

  • 在xml配置中,利用 property 标签实现 setter 方式注入,具体实现:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置dao--><bean id="userDaoBean" class="com.ncpowernode.spring6.dao.UserDao"/><!--配置service--><bean id="userServiceBean" class="com.ncpowernode.spring6.service.UserService"><!--想让Spring 调用对应的set 方法,需要配置property 标签--><!--name 属性怎么指定值:set 方法的方法名,去掉set,然后把剩下的单词首字母编小写,写到这里--><!--ref 翻译为引用,英语单词:references,ref后面指定的是bean 的id--><!--set方法起名的时候,不要为难自己,遵循Bean规范,所以name位置写属性名就可以了--><property name="userDao" ref="userDaoBean"/></bean></beans>
  • property 标签 name 属性值是 set方法名去掉set,然后把剩下的第一个字符改为小写,其余不变的字符串。

  • ref 属性值是 IoC容器中所对应的 Bean对象的 Id

内部Bean和外部Bean

这里在 property 中使用了 ref 属性值去指明注入的对象,这种方式属于外部Bean

以下方式就是利用内部Bean(就是property标签下利用bean子标签):

<property name="userDao"><bean class="com.ncpowernode.spring6.dao.UserDao"/>
</property>
  • UserDao 类中封装内容:

在这里插入图片描述

  • UserService 类中封装的业务内容

在这里插入图片描述

  • 测试:

在这里插入图片描述

构造方式(xml配置中的constructor-arg标签)

  • 在 xml 配置中,在 constructor-arg 标签下配置要注入的对象,具体如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="vipDaoBean" class="com.ncpowernode.spring6.dao.VipDao"/><bean id="vipServiceBean" class="com.ncpowernode.spring6.service.VipService"><!--构造注入--><!--index 属性指定参数下标,第一个参数是0,第二个参数是1,以此类推ref 属性用来指定注入的bean 的id--><!--指定构造方法的第一个参数,下标是0--><!--<constructor-arg index="0" ref="vipDaoBean"/>--><!--根据参数的名字--><constructor-arg name="vipDao" ref="vipDaoBean"/></bean></beans>
  • VipDao 类的封装内容
public class VipDao {private final Logger logger = LoggerFactory.getLogger(VipDao.class);public void insert(){logger.info("VipDao正在保存数据");}
}
  • VipService 类的封装业务内容
public class VipService {private VipDao vipDao;public VipService(VipDao vipDao){this.vipDao = vipDao;}public void save(){vipDao.insert();}}

测试:

在这里插入图片描述

相关文章:

【SSM】Spring对IoC的实现方式DI详讲

控制反转的一种实现方式——依赖注入一、IoC 控制反转&#xff08;Overview&#xff09;依赖注入&#xff08;DI&#xff09;- Overview利用 IoC&#xff08;控制反转&#xff09;这种思想有什么好处呢&#xff1f;二、依赖注入的方式setter 方式&#xff08;xml配置中的proper…...

【QT 5 相关实验-示波器-学习笔记-示波器组件练习与使用总结】

【QT 5 相关实验-示波器-学习笔记-示波器组件练习与使用总结】1、概述2、实验环境3、参考资料-致谢4、自我提升实验效果视频演示5、代码练习-学习后拆解-实验步骤&#xff08;1&#xff09;头文件部分-"mwaveview.h"&#xff08;2&#xff09;cpp文件部分-"mwav…...

二维数组中的查找(两种解法,各有千秋)

凡事都有可能&#xff0c;永远别说永远。——《放牛班的春天》今天一题为再一个行列都有序的二维数组中寻找一个目标值&#xff0c;我们第一时间想到的可能是很暴力的解法&#xff0c;例如从头到尾进行遍历&#xff0c;这样能做出来&#xff0c;但是借用武忠祥老师的一句话&…...

quartz使用及原理解析

quartz简介 ​ Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;完全由Java开发&#xff0c;可以用来执行定时任务&#xff0c;类似于java.util.Timer。但是相较于Timer&#xff0c; Quartz增加了很多功能&#xff1a; 持久性作业 - 就是保持调度…...

Datawhale组队学习:大数据 D2——分布式文件系统(HDFS)

妙趣横生大数据 Day2三、Hadoop 分布式文件系统(HDFS)1. 分布式文件系统2. HDFS 简介3. HDFS 体系结构4. HDFS存储原理数据冗余存储数据存储策略数据错误与恢复5. HDFS数据读写过程读写过程HDFS故障类型和其检测方法HDFS编程实验1. 本地和集群文件间操作2. 基本文件操作3. Hado…...

CCIE重认证-300-401-拖图题全

拖图 拖图题 编程 snippet&#xff1b;192.168.5.0&#xff0c;mask 255.255.255.0&#xff1b;number是192.168.5.0&#xff1b;mask是255.255.255.0 snippets&#xff1b;edit-config对config&#xff0c;loopback对name 100&#xff0c;address对primary&#xff0c;mask…...

如何动态的创建类?type的其他用法?什么是元类,如何自定义元类?

1、python中一切都是对象&#xff0c;类也不例外&#xff0c;type是object的子类&#xff0c;是创建类的类。 如何动态的创建一个类&#xff1f; 用脚丫子创建 用脑子创建 不会 不知道什么事动态类 大家可能会有一堆的疑惑&#xff0c;是的我也是有很多疑惑那让我们一起来探个…...

XCP实战系列介绍15-XCP故障排查指导

本文框架 1.概述2. 通过调试器排查2.1 打开Det功能2.2 如何确定Det ErrorCode3. 通过XCP应答报文排查3.1 FE报文组成及故障码对应关系3.2 举个例子1.概述 前面几篇文章我们介绍了基于Davinci开发工具的XCP配置指导,配好了,代码也生成了,但是程序一定能正常跑起来吗?就算软…...

吉林大学软件需求分析与规范(Software Requirements Analysis Specification)

chapter0课程简介&#xff1a;◼ 软件工程专业核心课程之一◼ 软件工程课程体系最前端课程◼ 主要内容&#xff1a;需求的基本概念&#xff0c;需求的分类&#xff0c;需求工程的基本过程&#xff0c;需求获取的方法、步骤、技巧&#xff0c;需求分析和建模技术&#xff0c;需求…...

PyTorch - Conv2d 和 MaxPool2d

文章目录Conv2d计算Conv2d 函数解析代码示例MaxPool2d计算函数说明卷积过程动画Transposed convolution animationsTransposed convolution animations参考视频&#xff1a;土堆说 卷积计算 https://www.bilibili.com/video/BV1hE411t7RN 关于 torch.nn 和 torch.nn.function t…...

leetcode Day2(昨天实习有点bug,心态要崩了)

int carry 0;for(int i a.size() - 1, j b.size() - 1; i > 0 || j > 0 || carry; --i, --j) {int x i < 0 ? 0 : a[i] - 0;int y j < 0 ? 0 : b[j] - 0;int sum (x y carry) % 2;carry (x y carry) / 2;str.insert(0, 1, sum 0);}return str;加一&a…...

另一种思考:为什么不选JPA、MyBatis,而选择JDBCTemplate

以下内容转载自&#xff1a;https://segmentfault.com/a/1190000018472572 作者&#xff1a;scherman 因为项目需要选择数据持久化框架&#xff0c;看了一下主要几个流行的和不流行的框架&#xff0c;对于复杂业务系统&#xff0c;最终的结论是&#xff0c;JOOQ是总体上最好的…...

LeetCode 338. 比特位计数

给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0 --> 0 1 --> …...

排序评估指标——NDCG和MAP

在搜索和推荐任务中&#xff0c;系统常返回一个item列表。如何衡量这个返回的列表是否优秀呢&#xff1f; 例如&#xff0c;当我们检索【推荐排序】&#xff0c;网页返回了与推荐排序相关的链接列表。列表可能会是[A,B,C,G,D,E,F],也可能是[C,F,A,E,D]&#xff0c;现在问题来了…...

[Android Studio] Android Studio Virtual Device(AVD)虚拟机的功能试用

&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Android Debug&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Topic 发布安卓学习过程中遇到问题解决过程&#xff0c;希望我的解决方案可以对小伙伴们有帮助。 &#x1f680;write…...

kafka-3-kafka应用的核心要点和内外网访问

kafka实战教程(python操作kafka)&#xff0c;kafka配置文件详解 Kafka内外网访问的设置 1 kafka简介 根据官网的介绍&#xff0c;ApacheKafka是一个分布式流媒体平台&#xff0c;它主要有3种功能&#xff1a; (1)发布和订阅消息流&#xff0c;这个功能类似于消息队列&#x…...

VS2017+OpenCV4.5.5 决策树-评估是否发放贷款

决策树是一种非参数的监督学习方法&#xff0c;主要用于分类和回归。 决策树结构 决策树在逻辑上以树的形式存在&#xff0c;包含根节点、内部结点和叶节点。 根节点&#xff1a;包含数据集中的所有数据的集合内部节点&#xff1a;每个内部节点为一个判断条件&#xff0c;并且…...

Prometheus 记录规则和警报规则

前提环境&#xff1a; Docker环境 涉及参考文档&#xff1a; Prometheus 录制规则Prometheus 警报规则 语法检查规则 promtool check rules /path/to/example.rules.yml一&#xff1a;录制规则语法 groups 语法&#xff1a; groups:[ - <rule_group> ]rule_group…...

(API)接口测试的关键技术

接口测试也就是API测试&#xff0c;从名字上可以知道是面向接口的测试活动。所以在讲API测试之前&#xff0c;我们应该说清楚接口是什么&#xff0c;那么接口就是有特定输入和特定输出的一套逻辑处理单元&#xff0c;而对于接口调用方来说&#xff0c;不用知道自身的内部实现逻…...

快速排序算法原理 Quicksort —— 图解(精讲) JAVA

快速排序是 Java 中 sort 函数主要的排序方法&#xff0c;所以今天要对快速排序法这种重要算法的详细原理进行分析。 思路&#xff1a;首先快速排序之所以高效一部分原因是利用了离散数学中的传递性。 例如 1 < 2 且 2 < 3 所以可以推出 1 < 3。在快速排序的过程中巧…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...

十二、【ESP32全栈开发指南: IDF开发环境下cJSON使用】

一、JSON简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;具有以下核心特性&#xff1a; 完全独立于编程语言的文本格式易于人阅读和编写易于机器解析和生成基于ECMAScript标准子集 1.1 JSON语法规则 {"name"…...