当前位置: 首页 > 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指向不同的类,这是不合法的

http://www.lryc.cn/news/233306.html

相关文章:

  • playwright在vscode+jupyter中出现NotImplementedError问题
  • js 实现文件上传
  • 5. Spring源码篇之BeanDefinition
  • kotlin--2.面向对象
  • Linux安装RabbitMQ详细教程
  • rviz是如何获取图像里选择的点云的3D坐标的
  • 响应体和状态码
  • CNN进展:AlexNet、VGGNet、ResNet 和 Inception
  • 数据的存储--MongoDB文档存储
  • Notepad++ 通过HexEditor插件查看.hprof文件、heap dump文件的堆转储数据
  • 微服务学习 | Eureka注册中心
  • spring boot集成quartz
  • [Linux] yum仓库相关
  • 2023.11.15-hivesql之炸裂函数explode练习
  • Linux - 内核 - 安全机制 - 内存页表安全
  • Linux---(七)Makefile写进度条(三个版本)
  • 数据库分页查询
  • 如何选择合适的数据库管理工具?Navicat Or DBeaver
  • Opencv!!在树莓派上安装Opencv!
  • 三菱FX3U小项目—传输带定分级控制
  • 实例解释遇到前端报错时如何排查问题
  • 微电影分销付费短剧小程序开发
  • 时间序列预测中的4大类8种异常值检测方法(从根源上提高预测精度)
  • Android---Gradle 构建问题解析
  • 02-2解析JsonPath
  • Git拉取远程指定分支
  • 使用Ant Design Pro开发时的一个快速开发接口请求的技巧
  • m1 rvm install 3.0.0 Error running ‘__rvm_make -j8‘
  • 对产品实现汇率换算服务(将两个CompletableFuture对象整合起来,无论它们是否存在依赖)
  • 数据库期末考前复习题(单选+多选+判断+解答)