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

news2024/11/28 16:32:53

在这里插入图片描述
以往在定义业务层实现时,在指定具体地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标签标示配置bean
    id属性标示给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指向不同的类,这是不合法的

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

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

相关文章

python连接redis库

在自动化过程中&#xff0c;如果需要动态获取某个数据时&#xff0c;需要连接redis数据库。下面来详细介绍下如何操作。 redis这个库是python自带的&#xff0c;直接import导入即可,如下; import redis 1. redis 地址和端口&#xff0c;端口一般都是默认的6379,只需要换下地…

第08章 面向对象编程(高级)

一 关键字&#xff1a;static class Circle{private double radius;public Circle(double radius){this.radiusradius;}public double findArea(){return Math.PI*radius*radius;} }创建两个Circle对象&#xff1a; Circle c1new Circle(2.0); //c1.radius2.0 Circle c2new C…

python如何批量创建文件与文件夹

目录 一、引言 二、批量创建文件 1、使用os模块 2、使用pathlib模块 三、批量创建文件夹 1、使用os模块 2、使用pathlib模块 四、注意事项 五、总结与展望 一、引言 在Python中&#xff0c;我们经常需要创建文件和文件夹来存储和管理数据。批量创建文件和文件夹可以大…

实用技巧:在C和cURL中设置代理服务器爬取www.ifeng.com视频

概述&#xff1a; 网络爬虫技术作为一种自动获取互联网数据的方法&#xff0c;在搜索引擎、数据分析、网站监测等领域发挥着重要作用。然而&#xff0c;面对反爬虫机制、网络阻塞、IP封禁等挑战&#xff0c;设置代理服务器成为解决方案之一。代理服务器能够隐藏爬虫的真实IP地…

Everything——检索神兵

相信在日常生活工作中&#xff0c;大家肯定会有这样的困惑&#xff1a;由于一时疏忽&#xff0c;自己下载或编写的文件保存的路径丢失&#xff0c;想再次在茫茫内存中找到会很麻烦。今天学长将带来一款软件——Everything&#xff0c;其拥有强大的搜索功能&#xff0c;可以帮助…

UI游戏设计模板大放送:7种别具匠心的创意!

随着游戏产业的快速发展&#xff0c;UI游戏设计已经成为一个热门的设计行业&#xff0c;但与之前的设计相比&#xff0c;UI游戏设计还是比较特殊的&#xff0c;主要体现在UI游戏设计难度大&#xff0c;需要大量的手绘内容和对游戏玩法的理解上。这些门槛需要大量的时间去学习&a…

【Git学习一】初始化仓库git init的使用和提交git add与git commit的使用

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;Git等软件工具技术的使用 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要…

C++初阶-内存管理

内存管理 一、C/C内存分布二、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、C内存管理方式new/delete操作内置类型new和delete操作自定义类型 四、operator new与operator delete函数operator new与operator delete函数 五、new和delete的实现原理内置类…

Abaqus2023新功能:分析技术

隐式耦合的松弛和加速器方法 产品&#xff1a;Abaqus/Standard SIMULIA协同仿真引擎现在支持Aitkens松弛方法以及Anderson和Broyden加速器方法&#xff0c;为强耦合物理场提供稳健且省时高效的解决方案。此功能在 2022 FD04 &#xff08;FP.2232&#xff09;版本中首次提供。…

文件包含_常见文件包含情况

文件包含系列 相关函数 分类 实践 包含实现的场景

解决编译时提示“没有那个文件或目录 #include <pcap.h>”的问题

解决编译时提示“没有那个文件或目录 #include 当你在编译代码时遇到“没有那个文件或目录 #include <pcap.h>”的错误提示&#xff0c;这通常意味着编译器在你的系统路径中找不到 pcap.h 头文件。pcap.h 是网络流量捕获库 pcap 的头文件&#xff0c;用于在 C/C 程序中捕…

07 robotframework JS和RFS值传递

1、JS的值传给RFS变量 示例1&#xff1a; ${bb} Execute Javascript function rand ( n ){return ( Math.floor ( Math.random ( ) * n 1 ) );};var aa rand(100);return aa; sleep ${bb}ms 示例2&#xff1a; var a [];$("iframe&quo…

网站提示Internal Server Error的原因和解决方法分享

解决方法 登陆FTP或文件管理器,检查站点目录文件权限设置,将文件夹权限设置为755,单个文件权限设置为644。 这样设置644后,问题就可以解决,同时也不会影响网站的所需要的写入权限,满足网站正常运行。如果你的站点中有很多权限都要需要设置,为了提高效率。 应用导致分析…

巴菲特再度出手,清仓7家公司股票

KlipC报道&#xff1a;最新数据显示&#xff0c;伯克希尔第三季度总共清仓了7家公司的股份&#xff0c;其中包括动视暴雪、通用汽车、化工巨头塞拉尼斯、亿滋国际、强生、宝洁和联合包裹。 KlipC的合伙人Andi D表示&#xff1a;“此前最新的监管文件显示&#xff0c;伯克希尔哈…

QtiPlot for Mac v1.1.3(科学数据分析工具)

QtiPlot是一款跨平台科学绘图软件&#xff0c;它可以在Windows、Linux和Mac OS X等多个平台上运行。QtiPlot具有强大的数据分析和可视化功能&#xff0c;被广泛应用于学术界和工业界的数据处理和图形制作。 QtiPlot支持多种语言&#xff0c;包括但不限于英语、中文等&#xff…

微信小程序如何跳转到微信公众号文章,小程序如何关联公众号或订阅号

微信小程序如何跳转到微信公众号文章&#xff0c;小程序如何关联公众号或订阅号 前置条件 公众号最高管理权限&#xff08;或能与最高权限管理者配合操作&#xff09;小程序开发权限或最高管理权限 小程序方面 根据官方资料描述&#xff0c;小程序中展示微信公众号中的文章…

A Comprehensive Survey on Graph Neural Networks

A Comprehensive Survey on Graph Neural Networks----《图神经网络研究综述》 摘要 近年来&#xff0c;深度学习已经彻底改变了许多机器学习任务&#xff0c;从图像分类和视频处理到语音识别和自然语言理解。这些任务中的数据通常在欧几里得空间中表示。然而&#xff0c;越来…

用电子签章软件怎么给标书一键签章的小故事

在这个数字化时代&#xff0c;电子签章已经成为了商务往来的重要一环。作为国内电子签章软件的佼佼者&#xff0c;微签凭借其19年的电子签研发应用经验&#xff0c;为中小企业提供了安全可靠的电子签章软件服务。 从审批场景到合同签署&#xff0c;微签都展现出卓越的电子签章…

vb.net 实时监控双门双向门禁控制板源代码

本示例使用设备介绍&#xff1a;实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) Imports System.Net.Sockets Imports System.Net Imports System.Text Imports System.ThreadingImports System.Net.NetworkInformation Imports System.Man…

(C++类的初始化和清理)构造函数与析构函数

目录 1. 类的六个默认成员函数2. 构造函数&#xff08;Constructor&#xff09;2.1 概念2.2 特性 3. 析构函数&#xff08;Destructor&#xff09;3.1 概念3.2 特性 1. 类的六个默认成员函数 一个类中如果什么成员都没有&#xff0c;称为空类 class Date {};但是这并不代表空…