Spring实现IOC和DI入门案例(XML版)

文章目录

    • 1 IOC入门案例(XML版)
      • 1.1 思路分析
      • 1.2 代码实现
          • 步骤1:创建Maven项目
          • 步骤2:添加Spring的依赖jar包
          • 步骤3:添加案例中需要的类
          • 步骤4:添加spring配置文件
          • 步骤5:在配置文件中完成bean的配置
          • 步骤6:获取IOC容器
          • 步骤7:从容器中获取对象进行方法调用
          • 步骤8:运行程序
    • 2 DI入门案例(XML版)
      • 2.1 思路分析
      • 2.2 代码实现
          • 步骤1: 去除代码中的new
          • 步骤2:为属性提供setter方法
          • 步骤3:修改配置完成注入
          • 步骤4:运行程序

介绍完Spring的核心概念后,接下来我们得思考一个问题就是,Spring到底是如何来实现IOC和DI的

代码传送门(●’◡’●)

1 IOC入门案例(XML版)

1.1 思路分析

(1)Spring是使用容器来管理bean对象的,那么管什么?

  • 主要管理项目中所使用到的类对象,比如(Service和Dao)

(2)如何将被管理的对象告知IOC容器?

  • 使用配置文件

(3)被管理的对象交给IOC容器,要想从容器中获取对象,就先得思考如何获取到IOC容器?

  • Spring框架提供相应的接口

(4)IOC容器得到后,如何从容器中获取bean?

  • 调用Spring框架提供对应接口中的方法

(5)使用Spring导入哪些坐标?

  • 用别人的东西,就需要在pom.xml添加对应的依赖

1.2 代码实现

需求分析:将BookServiceImpl和BookDaoImpl交给Spring管理,并从容器中获取对应的bean对象进行方法调用。

1.创建Maven的java项目

2.pom.xml添加Spring的依赖jar包

3.创建BookService,BookServiceImpl,BookDao和BookDaoImpl四个类

4.resources下添加spring配置文件,并完成bean的配置

5.使用Spring提供的接口完成IOC容器的创建

6.从容器中获取对象进行方法调用

步骤1:创建Maven项目

1629734010072

步骤2:添加Spring的依赖jar包

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>
步骤3:添加案例中需要的类

创建BookService,BookServiceImpl,BookDao和BookDaoImpl四个类

public interface BookDao {
    public void save();
}
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}
public interface BookService {
    public void save();
}
public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
步骤4:添加spring配置文件

resources下添加spring配置文件applicationContext.xml,并完成bean的配置

1629734336440

步骤5:在配置文件中完成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">
 
    <!--bean标签标示配置bean
    	id属性标示给bean起名字
    	class属性表示给bean定义类型
	-->
	<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>

</beans>

注意事项:bean定义时id属性在同一个上下文中(配置文件)不能重复

步骤6:获取IOC容器

使用Spring提供的接口完成IOC容器的创建,创建App类,编写main方法

public class App {
    public static void main(String[] args) {
        //获取IOC容器
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    }
}
步骤7:从容器中获取对象进行方法调用
public class App {
    public static void main(String[] args) {
        //获取IOC容器
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
        // BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        // bookDao.save();
        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}
步骤8:运行程序

测试结果为:

image-20210729184337603

Spring的IOC入门案例已经完成,但是在BookServiceImpl的类中依然存在BookDaoImpl对象的new操作,它们之间的耦合度还是比较高,这块该如何解决,就需要用到下面的DI:依赖注入

2 DI入门案例(XML版)

对于DI的入门案例,我们依然先分析思路然后再代码实现

2.1 思路分析

(1)要想实现依赖注入,必须要基于IOC管理Bean

  • DI的入门案例要依赖于前面IOC的入门案例

(2)Service中使用new形式创建的Dao对象是否保留?

  • 需要删除掉,最终要使用IOC容器中的bean对象

(3)Service中需要的Dao对象如何进入到Service中?

  • 在Service中提供方法,让Spring的IOC容器可以通过该方法传入bean对象

(4)Service与Dao间的关系如何描述?

  • 使用配置文件

2.2 代码实现

需求:基于IOC入门案例,在BookServiceImpl类中删除new对象的方式,使用Spring的DI完成Dao层的注入

1.删除业务层中使用new的方式创建的dao对象

2.在业务层提供BookDao的setter方法

3.在配置文件中添加依赖注入的配置

4.运行程序调用方法

步骤1: 去除代码中的new

在BookServiceImpl类中,删除业务层中使用new的方式创建的dao对象

public class BookServiceImpl implements BookService {
    //删除业务层中使用new的方式创建的dao对象  = new BookDaoImpl();
    private BookDao bookDao;

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}
步骤2:为属性提供setter方法

在BookServiceImpl类中, 为BookDao提供setter方法

public class BookServiceImpl implements BookService {
    //删除业务层中使用new的方式创建的dao对象
    private BookDao bookDao;

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
    //提供对应的set方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

步骤3:修改配置完成注入

在配置文件中添加依赖注入的配置

<?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标签标示配置bean
    	id属性标示给bean起名字
    	class属性表示给bean定义类型
	-->
    <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

    <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <!--配置service与dao的关系-->
        <!--property标签表示配置当前bean的属性
        		name属性表示配置哪一个具体的属性
        		ref属性表示参照哪一个bean
		-->
        <property name="bookDao" ref="bookDao"/>
    </bean>

</beans>

注意:配置中的两个bookDao的含义是不一样的!!!

  • name="bookDao"中bookDao的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前面加set找对应的setBookDao()方法进行对象注入
  • ref="bookDao"中bookDao的作用是让Spring能在IOC容器中找到id为bookDao的Bean对象给bookService进行注入
  • 综上所述,对应关系如下:

1629736314989

步骤4:运行程序

运行,测试结果为:

image-20210729184337603

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【差分+操作】C. Helping the Nature

Problem - 1700C - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始手玩了一下 如果不是高低高的形式&#xff0c;那么一定不能通过操作3把全部元素变成0 因此就是先把所有元素变成高低高的形式 但是低在什么地方不确定 因此考虑枚举中间低谷位置&#xff0c;O(1)计…

ShardingSphere-JDBC整合SpringBoot JPA读写分离失败

问题 最近在整合ShardingSphere JDBC和Spring Boot的时候遇到一个问题,当ORM框架使用JPA时,读写分离会失效,查询仍然走主库并不会走从库!同样的配置使用Mybatis就没有任何问题。 在查阅各种资料后,初步确定未JPA事务问题 ShardingSphere负载均衡算法 我当前使用的版本是…

【历史上的今天】4 月 23 日:YouTube 上传第一个视频;数字音频播放器的发明者出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 23 日&#xff0c;世界读书日。在 1564 年的这一天&#xff0c;全世界最卓越的文学家之一莎士比亚出生&#xff1b;1616 年的这一天&#xff0c;莎士比亚…

shell脚本5数组

文章目录 数组1 数组定义方法2 获取数组长度2.1 读取数组值2.2 数组切片2.3 数组替换2.4 数组删除2.5 追加数组元素 3 实验3.1 冒泡法3.2 直接选择法3.3 反排序法 数组 1 数组定义方法 数组名(value0 valuel value2 …) 数组名( [0]value [1]value [2]value …) 列表名“val…

现在的00后,实在是太卷了,我们这些老油条都想辞职了......

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪20K&#xff0c;都快要超过我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家…

真题详解(传引用)-软件设计(七十五)

真题详解&#xff08;补码转换&#xff09;-软件设计&#xff08;七十四)https://blog.csdn.net/ke1ying/article/details/130674214 分治算法技术设计______。 答案&#xff1a;1、问题划分 2、递归求解 3、合并解 虚拟存储体系_____两级构成。 解析&#xff1a;主存 和 辅…

linux环境安装使用tomcat详解

01-安装Tomcat # 0.下载tomcat http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.46/bin/apache-tomcat-8.5.46.tar.gz # 1.通过工具上传到Linux系统中 # 2.解压缩到/usr目录中 [rootlocalhost ~]# tar -zxvf apache-tomcat-8.5.46.tar.gz -C /usr/ -C 用来指…

【AI绘图 丨 Midjourney 系列教程二】— 初识超火的AI绘画神器Midjourney

今天起&#xff0c;由 Midjourney 打头阵&#xff0c;让我们开始共同探索一系列的 AI 领域革命性作品&#xff0c;包括 Midjourney、Stable Diffusion、ChatGPT 等等&#xff0c;学习这些新时代的魔法和它的咒语。 写在前面 官方文档是最好的入门课程。相较于市面上琳琅满目的…

《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

1 以太网 1.1 介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有两类&#xff1a;第一类是经典以太网&#xff0c;第二类是交换式以太网&#xff0c;使用了一种称为交换机的设备连接不同的计算机。 经典以太网&#xff1a;是以太网的原始形式&#xff0c;运行速度从 …

信创办公–基于WPS的EXCEL最佳实践系列 (宏的录制)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;宏的录制&#xff09; 目录 应用背景操作步骤1、宏的录制启用2、宏的使用3、宏的保存4、宏的禁用 应用背景 宏是一个自动化完成重复性工作的工具&#xff0c;使用宏可以提高我们的工作效率&#xff0c;那应该怎样使用宏这一…

ArcSWAT报错:Error Number :-2147467259; 对 COM 组件的调用返回了错误 HRESULT E_FAIL

文章目录 1 报错内容2 报错解决3 并行处理的设置补充说明 1 报错内容 通常为连续两段报错&#xff1a; Error Number :-2147467259 Error Message :对 COM 组件的调用返回了错误 HRESULT E_FAIL 。 Module name : mSWFlow Function name : createStream Procedure ( error li…

chatgpt赋能Python-python3_5如何安装

Python3.5安装指南 Python是一种高级编程语言&#xff0c;它广泛用于Web开发、数据分析、机器学习等领域。在Python的众多版本中&#xff0c;Python3.5是最常用的版本之一。如果你正在考虑学习Python3.5或者需要使用Python3.5进行项目开发&#xff0c;那么接下来的安装指南将会…

第十三章 使用DHCP动态管理主机地址

文章目录 第十三章 使用DHCP动态管理主机地址一、动态主机地址管理协议1、DHCP简介2、DHCP常见术语 二、部署DHCP服务程序1、安装DHCP服务程序2、配置文件参考模板3、dhcpd服务程序配置文件中常见参数及作用 三、自动管理IP地址1、机房所用的网络地址以及参数信息2、关闭虚拟网…

Flink从入门到精通之-10容错机制

Flink从入门到精通之-10容错机制 流式数据连续不断地到来&#xff0c;无休无止&#xff1b;所以流处理程序也是持续运行的&#xff0c;并没有一个明确的结束退出时间。机器运行程序&#xff0c;996 起来当然比人要容易得多&#xff0c;不过希望“永远运行”也是不切实际的。因…

STM32-ADC多通道输入实验

之前已经介绍了几个ADC的笔记和实验了&#xff0c;链接如下&#xff1a; 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 STM32-单通道ADC采集&#xff08;DMA读取&#xff09;实验_Mr_rustylake的博客-CSDN博客 接下来…

语音常识与基本概念

数字信号 连续时间信号&#xff1a;在连续时间范围内定义的信号&#xff0c;信号的幅度可以是连续的(模拟信号)&#xff0c;也可以是离散的 离散时间信号&#xff1a;时间为离散变量的信号&#xff0c;即独立变量时间被量化了&#xff0c;而幅度仍是连续变化的 数字信号&#x…

【云计算与虚拟化】第二章 实验二 Vmware Workstation 15的使用

实验二 Vmware Workstation 15的使用 在上一实验的基础上&#xff0c;将两台虚拟机调节到在桥接模式下&#xff0c;配置相应的网络参数&#xff0c;实现虚拟机1和2能相互通信&#xff0c;虚拟机1和2能够ping通外网&#xff0c;虚拟机1和2能ping通物理机。 &#xff08;截取…

车规级MCU芯片

作为车辆控制的核心器件&#xff0c;MCU主要用于车身控制、驾驶控制、信息娱乐和驾驶辅助系统。 8位MCU &#xff1a;提供低端控制功能:风扇控制、空调控制、雨刷、天窗、 车窗升降、低端仪表盘、集线盒、座椅控制、门控模块。 16位MCU &#xff1a;提供中端控制功能:用于动力…

【QuartusII】0-创建工程模板

一、创建工程 1、激活安装quartus II软件后&#xff0c;打开即见如下界面 2、在菜单栏 “File -> New Project Wizard…”中&#xff0c;进入创建工程流程 3、第一部分&#xff0c;如下图&#xff0c;配置路径、项目名称、以及顶层文件&#xff08;类似C语言的main&#xf…

MySQL---存储过程(局部变量、用户变量、系统变量(全局变量、会话变量)、传参(in、out、inout))

1. 存储过程特性 存储过程就是数据库 SQL 语言层面的代码封装与重用。 有输入输出参数&#xff0c;可以声明变量&#xff0c;有if/else, case,while等控制语句&#xff0c;通过编写存储过程&#xff0c;可以实现 复杂的逻辑功能&#xff1b; 函数的普遍特性&#xff1a;模块…