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

【Spring】 Spring中的IoC(控制反转)

在这里插入图片描述
以往在定义业务层实现时,在指定具体地Dao时候需要具体地定义出其实现:

public class BookServiceImpl implements BookService{private BookDao bookDao = new BookDaoImpl();public void save(){bookDao.save()}
}
public class BookDaoImpl implements BookDao {public void save(){System.out.println("book dao save...");}
}

但是当我们想新定义一个实现方法的时候,例如:

public class BookDaoImpl2 implements BookDao {public void save(){System.out.println("book dao save...2");}
}

我们就要修改BookServiceImpl类,将里面的private BookDao bookDao = new BookDaoImpl()修改为private BookDao bookDao = new BookDaoImpl2(),这带来如下所示的问题:耦合度偏高,所以想要使用IoC,将对象创建控制权由程序内部转移到外部
在这里插入图片描述
从而,在定义BookServiceImpl中的bookDao的时候,就不需要在进行new…进而修改很多的代码
Spring实现IoC的方式如最上面的图,这里给出一个IoC的案例,手动配置Spring中的IoC,做法如下:

  1. pom.xml中加入dependency,刷新maven:
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>
</dependency>
  1. 在resource下创建Spring config文件配置bean:
<?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"><!--1. 导入spring的坐标spring-context--><!--2. 配置bean--><!--bean标签标示配置beanid属性标示给bean起名字class属性标示给bean定义的类型--><bean id="bookDao" class="com.example.demo231116.dao.impl.BookDaoImpl" /><bean id="bookService" class="com.example.demo231116.service.impl.BookServiceImpl" />
</beans>
  1. 获取IoC容器和bean:
public class Demo231116Application2 {public static void main(String[] args) {// 3. 获取IoC容器ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");// 4. 获取bean
//        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//        bookDao.save();BookService bookService = (BookService) ctx.getBean("bookService");bookService.save();}
}

这里getBean()中的参数就是在xml文件中配置的bean的id,配置中直接指向对应的类
所以自然而然也可以知道,我们不可以定义相同id指向不同的类,这是不合法的

相关文章:

【Spring】 Spring中的IoC(控制反转)

以往在定义业务层实现时&#xff0c;在指定具体地Dao时候需要具体地定义出其实现&#xff1a; public class BookServiceImpl implements BookService{private BookDao bookDao new BookDaoImpl();public void save(){bookDao.save()} }public class BookDaoImpl implements …...

playwright在vscode+jupyter中出现NotImplementedError问题

近期因个人需要接触playwright&#xff0c;由于playwright新接触&#xff0c;想用jupyter进行API测试学习。刚开始使用sync_playwright&#xff0c;在playwright的Conda运行环境中&#xff0c;以console模式和单文件直接运行模式&#xff0c;都能正常运行。但是进入jupyter中后…...

js 实现文件上传

input 类型为file <inputtype"file"class"absolute "change"fileUpload"/> const fileUpload (e: any) > {const formData new FormData(); // form-data数据类型formData.append(file, e.target.files[0]);// 获取文件信息&#xff…...

5. Spring源码篇之BeanDefinition

简介 在spring中BeanDefinition是一个接口&#xff0c;下面也有很多的实现类 大致如下 BeanDefinitionAbstractBeanDefinitionRootBeanDefinition 最终每个BeanDefinition都是一个 RootBeanDefinitionChildBeanDefinition 现在不用了废弃&#xff…...

kotlin--2.面向对象

目录 一.概念 Kotlin 类/对象 二.创建类 1.创建类 2.构造函数 2.getter 和 setter 实例 3.主构造器 实例 4.次构造函数 实例 5.抽象类 6.嵌套类 7.内部类 8.匿名内部类 9.类的修饰符 实例 三.继承 1.概念 2.构造函数 (1)子类有主构造函数 (2)子类没有主构…...

Linux安装RabbitMQ详细教程

一、下载安装包 下载erlang-21.3-1.el7.x86_64.rpm、rabbitmq-server-3.8.8-1.el7.noarch.rpm 二、安装过程 1、解压erlang-21.3-1.el7.x86_64.rpm rpm -ivh erlang-21.3-1.el7.x86_64.rpm2、安装erlang yum install -y erlang3、查看erlang版本号 erl -v4、安装socat …...

rviz是如何获取图像里选择的点云的3D坐标的

以前以为rviz是用OpenGL渲染绘图&#xff0c;那么获取图像里像素点对应的真实3D坐标是采用的OpenGL里提供的API实现的&#xff0c;结果一看代码还真不是这样&#xff0c;rviz也就渲染用了OpenGL&#xff0c;其他都是自己实现的&#xff0c;图像界面的实现完全是遵循MVC设计模式…...

响应体和状态码

后端响应体和状态码设计 主流技术&#xff1a;响应体 和 状态码结合使用 响应体&#xff1a;数据 响应 给前端的 格式 1、为什么要设计统一响应体? 1、系统默认提供许多的状态码&#xff0c;但HTTP的状态码数量有限。 通过修改响应返回的JSON数据&#xff0c;更好的表达业务中…...

CNN进展:AlexNet、VGGNet、ResNet 和 Inception

一、说明 对于初学者来说&#xff0c;神经网络进展的历程有无概念&#xff1f;该文综合叙述了深度神经网络的革命性突破&#xff0c;从AlexNet开始&#xff0c;然后深度VGG的改进&#xff0c;然后是残差网络ResNet和 Inception&#xff0c;如果能讲出各种特色改进点的和改进理由…...

数据的存储--MongoDB文档存储

MongoDB文档存储 NoSQL&#xff0c;全称为Not Only SQL&#xff0c;意为不仅仅是SQL&#xff0c;泛指非关系型数据库。NoSQL是基于键值对的&#xff0c;而且不需要经过SQL层的解析&#xff0c;数据之间没有耦合性&#xff0c;性能非常高。 非关系行数据库又可细分如下。 键值存…...

Notepad++ 通过HexEditor插件查看.hprof文件、heap dump文件的堆转储数据

文章目录 需求场景插件安装查看notepad的版本&#xff0c;看看是32位的还是64位的下载对应的版本解压导入插件打开notepad插件文件夹&#xff1a;Notepad安装目录新建一个HexEditor文件夹选中插件文件导入 重启notepad使用 需求场景 想要查看app内存的某个域的数据。 利用Andr…...

微服务学习 | Eureka注册中心

微服务远程调用 在order-service的OrderApplication中注册RestTemplate 在查询订单信息时&#xff0c;需要同时返回订单用户的信息&#xff0c;但是由于微服务的关系&#xff0c;用户信息需要在用户的微服务中去查询&#xff0c;故需要用到上面的RestTemplate来让订单的这个微…...

spring boot集成quartz

目录 1.定时任务实现 2.quartz说明 3.存储方式 4.示例 5.定时任务的重新定制&#xff0c;恢复&#xff0c;暂停及删除 1.定时任务实现 定时任务的实现方式有很多&#xff0c;如下&#xff1a; 1.启动类中添加EnableScheduling&#xff0c;开启定时任务功能&#xff0c;然…...

[Linux] yum仓库相关

一、yum仓库 1.1 yum简介 yum 是一种基于 RPM 软件包&#xff08;Red-Hat Package Manager 的缩写&#xff09;的软件更新机制&#xff0c;可自动解决软件包之间的依赖关系。这就解决了日常工作中花费大量时间寻找安装包的问题。 为什么会出现依赖 linux 本身就有简化系统的优…...

2023.11.15-hivesql之炸裂函数explode练习

把一个容器的多个数据炸裂出单独展示: explode(容器) 需求:将NBA总冠军球队数据使用explode进行拆分&#xff0c;并且根据夺冠年份进行倒序排序。 1.建表 --step1:建表 create table the_nba_championship(team_name string,champion_year array<string> ) row format…...

Linux - 内核 - 安全机制 - 内存页表安全

说明 内核页表安全的最终目标是&#xff1a;将内核使用到的内存页&#xff08;内核与module占用&#xff09;的属性&#xff08;读/写/可执行&#xff09;配置成安全的&#xff0c;即&#xff1a;代码段和rodata段只读&#xff0c;非代码段不能执行等&#xff0c;用来防御堆栈…...

Linux---(七)Makefile写进度条(三个版本)

文章目录 一、前提引入&#x1f397;️下面的代码什么现象&#xff1f;&#x1f397;️下面的代码什么现象&#xff1f; 二、缓冲区三、回车换行&#x1f397;️注意&#x1f397;️图解&#x1f397;️老式回车键造型&#xff08;意思是充当两个动作&#xff09;&#x1f397;…...

数据库分页查询

数据库只所以要分页查询&#xff0c;其实是界面显示的需要&#xff0c;不是数据库的需要。 数据库本身查询是很快的。本文章是针对这种情况的。 如果数据库本身查询慢&#xff0c;那是优化查询语句的事情了。不在本文章范围内。 今天遇到了这个问题。 是个老项目。在原有的查询…...

如何选择合适的数据库管理工具?Navicat Or DBeaver

写在前面 在阅读本文之前&#xff0c;糖糖给大家准备了Navicat和DBeaver安装包&#xff0c;在公众号内回复“Navicat”或“DBeaver”或"数据库管理工具"来下载。 引言 对于测试而言&#xff0c;在实际工作中往往会用到数据库&#xff0c;那么选择使用哪种类型的数…...

Opencv!!在树莓派上安装Opencv!

一、更新树莓派系统 sudo apt-get update sudo apt-get upgrade二、安装python-opencv sudo apt-get install libopencv-dev sudo apt-get install python3-opencv三、查看是否安装成功 按以下命令顺序执行&#xff1a; python import cv2 cv2.__version__如果出现版本号&a…...

FPGA新手避雷指南:你的第一个呼吸灯项目可能卡在这几个Vivado仿真和引脚分配问题上

FPGA新手避雷指南&#xff1a;从仿真到引脚分配的完整呼吸灯实战 第一次在FPGA上实现呼吸灯效果&#xff0c;本该是充满成就感的时刻。但当你按照教程一步步操作&#xff0c;点击"Generate Bitstream"后&#xff0c;板子上的LED却毫无反应——这种挫败感我太熟悉了。…...

3个关键步骤:如何用Bilibili-Evolved打造60fps流畅播放体验

3个关键步骤&#xff1a;如何用Bilibili-Evolved打造60fps流畅播放体验 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved Bilibili-Evolved作为一款强大的哔哩哔哩增强脚本&#xff0c;为追求极…...

船舶水动力学与运动控制技术指南:从理论建模到工程实践

船舶水动力学与运动控制技术指南&#xff1a;从理论建模到工程实践 【免费下载链接】FossenHandbook Handbook of Marine Craft Hydrodynamics and Motion Control is an extensive study of the latest research in marine craft hydrodynamics, guidance, navigation, and co…...

Cursor Pro免费激活终极指南:如何突破试用限制重新获得AI编程体验

Cursor Pro免费激活终极指南&#xff1a;如何突破试用限制重新获得AI编程体验 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reach…...

Janus-Pro-7B效果展示:手写体/表格/多语言混合OCR识别准确率实测

Janus-Pro-7B效果展示&#xff1a;手写体/表格/多语言混合OCR识别准确率实测 1. 引言 你有没有遇到过这样的场景&#xff1f;翻出一张老照片&#xff0c;背面是长辈用钢笔写下的寄语&#xff0c;字迹有些潦草&#xff0c;想把它转成电子版保存&#xff0c;却一个字也认不出来…...

RWKV7-1.5B-G1A助力运维:利用Xshell脚本自动化模型部署与监控

RWKV7-1.5B-G1A助力运维&#xff1a;利用Xshell脚本自动化模型部署与监控 1. 引言 "又到周五下午4点&#xff0c;运维团队收到紧急需求——需要在10台服务器上部署最新的RWKV7-1.5B-G1A模型服务。"这样的场景对运维工程师来说再熟悉不过。传统的手动部署方式不仅耗…...

Phi-4-reasoning-vision-15B快速上手:使用Postman完成图像问答API全流程调试

Phi-4-reasoning-vision-15B快速上手&#xff1a;使用Postman完成图像问答API全流程调试 1. 引言&#xff1a;认识视觉推理模型 Phi-4-reasoning-vision-15B是微软推出的新一代视觉多模态推理模型&#xff0c;它能像人类一样理解图片内容并进行智能问答。想象一下&#xff0c…...

MATLAB与AI结合:使用Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF进行科学计算与数据分析

MATLAB与AI结合&#xff1a;使用Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF进行科学计算与数据分析 1. 科研与工程中的智能计算新范式 想象一下这样的场景&#xff1a;你正在处理一组复杂的实验数据&#xff0c;需要快速实现滤波、拟合和可视化。传统方式可能需要…...

从羊肠小道到智能高速:HTTP1到HTTP3的演进之路

引言 计算机网络就像一张遍布全球的道路系统&#xff0c;服务器是一座座城市、村庄&#xff0c;客户端是穿梭其中的车辆&#xff0c;而HTTP协议&#xff0c;就是规范车辆通行、货物传递的交通规则。从HTTP1到HTTP3的演进&#xff0c;本质上就是这条“网络道路”的升级史——从泥…...

提升开发效率:Android Studio零障碍IDE本地化配置指南

提升开发效率&#xff1a;Android Studio零障碍IDE本地化配置指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 开发人员在使用…...