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

Spring IoC【控制反转】DI【依赖注入】

在这里插入图片描述

文章目录

    • 控制反转(IoC)
    • 依赖注入(DI)
    • IoC原理及解耦
    • IoC 容器的两种实现
      • BeanFactory
      • ApplicationContext


IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序

Spring 通过 IoC 容器管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,Spring Bean与使用 new 关键字创建的 Java 对象没有任何区别。

IoC 容器是 Spring 框架中最重要的核心组件之一,它贯穿了 Spring 从诞生到成长的整个过程。

控制反转(IoC)

在这里插入图片描述

传统的 Java 应用中,一个类想要调用另一个类中的属性或方法,通常会先在其代码中通过 new Object() 的方式将后者的对象创建出来,然后才能实现属性或方法的调用。也就是说传统的开发方式,对象创建的控制权交给了程序员

Spring 应用中,Java 对象创建的控制权交给容器,这就是控制反转

1. 开发人员通过 XML 配置文件、注解、Java 配置类等方式,对 Java 对象进行定义,例如在 XML 配置文件中使用 标签、在 Java 类上使用 @Component 注解等。
2. Spring 启动时,IoC 容器会自动根据对象定义,会将这些对象创建并管理,这些被 IoC 容器创建并管理的对象被称为 Spring Bean。
3. 当我们想要使用某个 Bean 时,可以直接从 IoC 容器中获取(例如通过 ApplicationContext 的 getBean() 方法),而不再是通过手动 new 来创建对象

IoC 带来的最大改变不是代码层面的,而是从思想层面上发生了“主从换位”的改变。在Spring 应用中,IoC 容器掌握着主动权,调用者则变成了被动的一方,被动的等待 IoC 容器创建它所需要的对象(Bean)

这个过程发生了控制权的反转,把原本调用者通过代码实现的对象的创建,反转给 IoC 容器来帮忙实现,因此我们将这个过程称为 Spring 的“控制反转”

依赖注入(DI)

随着时间的推移,设计者发现,IoC很多框架都有,因此Spring不愿止步于此,在Ioc的基础之上,又引入了依赖注入这一个概念

依赖注入(Denpendency Injection,简写为 DI),在面向对象中,对象和对象之间是存在一种叫做“依赖”的关系。简单来说,依赖关系就是在一个对象中需要用到另外一个对象,即对象中存在一个属性,该属性是另外一个类的对象。
在这里插入图片描述

IoC原理及解耦

软件开发过程中,系统中的各个对象之间、各个模块之间、软件系统和硬件系统之间,或多或少都存在一定的耦合关系。

若一个系统的耦合度过高,那么就会造成难以维护的问题,但完全没有耦合的代码几乎无法完成任何工作,这是由于几乎所有的功能都需要代码之间相互协作、相互依赖才能完成。因此我们在程序设计时,所秉承的思想一般都是在不影响系统功能的前提下,最大限度的降低耦合度。

IoC 底层通过工厂模式、Java 的反射机制、XML 解析等技术,将代码的耦合度降低到最低限度

由于对象的基本信息、对象之间的依赖关系都是在配置文件中定义的,并没有在代码中紧密耦合,因此即使对象发生改变,我们也只需要在配置文件中进行修改即可,而无须对 Java 代码进行修改,这就是 Spring IoC 实现解耦的原理。

IoC 容器的两种实现

IoC 思想基于 IoC 容器实现的,IoC 容器底层其实就是一个 Bean 工厂。Spring 框架为我们提供了两种不同类型 IoC 容器,它们分别是 BeanFactoryApplicationContext

BeanFactory

BeanFactory 是 IoC 容器的基本实现,也是 Spring 提供的最简单的 IoC 容器,它提供了 IoC 容器最基本的功能,由 org.springframework.beans.factory.BeanFactory 接口定义。

BeanFactory 采用懒加载(lazy-load)机制,容器在加载配置文件时并不会立刻创建 Java 对象,只有程序中获取(使用)这个对对象时才会创建。

ApplicationContext

ApplicationContext 是 BeanFactory 接口的子接口,是对 BeanFactory 的扩展。ApplicationContext 在 BeanFactory 的基础上增加了许多企业级的功能,例如 AOP(面向切面编程)、国际化、事务支持等。ApplicationContext 接口有两个常用的实现类 ClassPathXmlApplicationContext ,加载类路径 ClassPath 下指定的 XML 配置文件,并完成 ApplicationContext 的实例化工作。 FileSystemXmlApplicationContext ,加载指定的文件系统路径中指定的 XML 配置文件,并完成 ApplicationContext 的实例化工作

public class TestSpring {public static void main(String[] args) {//启动工厂ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");//获取工厂中创建好的对象,参数:获取工厂中指定对应的唯一标识UserDAO userDAO = (UserDAO) context.getBean("userDAO");userDAO.save("Hello Spring ClassPathXmlApplicationContext");BeanFactory context1 = new ClassPathXmlApplicationContext("spring.xml");//FileSystemXmlApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("D://xxx");//UserDAO userDAO2 = fileSystemXmlApplicationContext.getBean("userDAO", userDAO.getClass());UserDAO userDAO1 = (UserDAO) context1.getBean("userDAO");userDAO1.save("hello spring beanFactory");}
}

结果

userDAO save name = Hello Spring ClassPathXmlApplicationContext
userDAO save name = hello spring beanFactory

在这里插入图片描述

相关文章:

  • 爬虫逆向实战(41)-某花顺登陆(Cookie、MD5、SHA256)
  • 关于scrapy模块中间件的简单理解
  • 案例分享:高科技企业产品管理部门设置和产品经理岗位设置
  • MySQL 面试突击指南:核心知识点解析1
  • YOLOv10改进 | 注意力篇 | YOLOv10引入YOLO-Face提出的SEAM注意力机制优化物体遮挡检测
  • 改进YOLOv7 | 在 ELAN 模块中添加【Triplet】【SpatialGroupEnhance】【NAM】【S2】注意力机制 | 附详细结构图
  • 浏览器组成的介绍
  • QT中QSettings的使用系列之二:保存和恢复应用程序主窗口
  • bash: nvcc: command not found
  • 查看 MAC 的 shell 配置文件
  • 2024考古之还在用原始JDBC开发 手搓 案例 实现一个模块的增删改
  • 基于51单片机的篮球计分器设计
  • 武汉工程大学24计算机考研数据,有学硕招收调剂,而专硕不招收调剂!
  • 【C++题解】1741 - 求出1~n中满足条件的数的个数和总和?
  • 国产芯片方案/血氧仪方案SIC88336
  • [译]CSS 居中(Center)方法大合集
  • 【React系列】如何构建React应用程序
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • JDK9: 集成 Jshell 和 Maven 项目.
  • MySQL QA
  • oldjun 检测网站的经验
  • python_bomb----数据类型总结
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 计算机在识别图像时“看到”了什么?
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 利用jquery编写加法运算验证码
  • 批量截取pdf文件
  • 实战|智能家居行业移动应用性能分析
  • 通信类
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #### go map 底层结构 ####
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1)(1.13) SiK无线电高级配置(六)
  • (14)Hive调优——合并小文件
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (阿里云万网)-域名注册购买实名流程
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • .net CHARTING图表控件下载地址
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net mvc 获取url中controller和action
  • .net 微服务 服务保护 自动重试 Polly
  • .net 怎么循环得到数组里的值_关于js数组
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .pyc文件是什么?
  • @RequestParam详解
  • @Transient注解
  • [\u4e00-\u9fa5] //匹配中文字符
  • [12] 使用 CUDA 加速排序算法
  • [20171102]视图v$session中process字段含义
  • [C++]spdlog学习