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

news2024/12/22 23:13:16

在这里插入图片描述

文章目录

    • 控制反转(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

在这里插入图片描述

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

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

相关文章

碉堡了!云原生大佬撰写的K8s学习指南,有点炸裂,建议运维都收藏!

在这个数字化转型的时代,容器化和云原生技术已成为软件开发的重要趋势。【Kubernetes】作为云原生领域的旗舰项目,不仅是一种容器编排工具,更是构建现代、弹性和可扩展应用程序的基础平台。 因此,对于运维人员来说,学…

裁剪图片的最简单方法?这四种裁剪方法真的超级简单!

裁剪图片的最简单方法?在丰富多彩的现代生活中,图片成为了我们表达、沟通甚至展示身份的重要媒介,然而,无论是出于个人审美还是专业需求,图片的格式和尺寸往往成为了我们不得不面对的问题,特别是那些未经雕…

Spring IOC 控制反转(注解版)

Spring IOC 控制反转 文章目录 Spring IOC 控制反转一、前言什么是控制反转(IOC)什么是依赖注入(DI) 二、介绍 IOC2.1 传统思想代码2.2 解决方案2.3 IOC思想代码2.4 IOC 使用(Autowired依赖注入)2.5 IOC 优…

一五三、MAC 安装MongoDB可视化工具连接

若没有安装brew包管理工具,在命令行输入安装命令 /bin/bash -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)”上面步骤安装完成后,开始安装MongoDB,输入安装命令: brew tap mongodb/brewbrew u…

LogicFlow 学习笔记——8. LogicFlow 基础 事件 Event

事件 Event 当我们使用鼠标或其他方式与画布交互时,会触发对应的事件。通过监听这些事件,可以获取其在触发时所产生的数据,根据这些数据来实现需要的功能。详细可监听事件见事件API。 监听事件 lf实例上提供on方法支持监听事件。 lf.on(&…

本地数据如何正确的导入SOLIDWORKS PDM系统

SOLIDWORKS 产品数据管理 (PDM) 解决方案可帮助您控制设计数据,并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional,您的团队能够:1. 安全地存储和索引设计数据以实现快速检索;2. 打消关…

一键掌控,4G红外插座引领智能生活新潮流!

随着科技的进步,市场上出现大量带语音、手机APP可控制的智能插座产品,由此可看出客户对产品的功能要求也越来越高,追求舒适的体验感,特别是对操控性的要求越来越高。但是目前大部分红外遥控插座均为WiFi插座类型,WiFi红…

osi七层网络模型安全加固

应用层加固 应用层的攻击: 1、针对应用层协议的攻击:HTTP攻击、DNS攻击、电子邮件攻击等,利用应用层协议的漏洞,构造恶意数据包,是目标服务器执行恶意代码或暴露敏感信息 HTTP攻击:XSS、CSRF、HTTP头注入…

MySQL之高级特性(五)

高级特性 查询缓存 如何配置和维护查询缓存 一旦理解查询缓存工作的原理,配置起来就很容了。它也只有少数的参数可供配置。如下所示: 1.query_cache_type 是否打开查询缓存。可以设置成OFF、ON或DEMAND。DEMAND表示只有在查询语句中明确写明SQL_CACHE的语句才放…

Excel 常用技巧(五)

Microsoft Excel 是微软为 Windows、macOS、Android 和 iOS 开发的电子表格软件,可以用来制作电子表格、完成许多复杂的数据运算,进行数据的分析和预测,并且具有强大的制作图表的功能。由于 Excel 具有十分友好的人机界面和强大的计算功能&am…

解锁呼叫中心运营的无限潜能 - 信必优数字化解决方案

在当今瞬息万变的商业环境中,呼叫中心已不仅仅是一个简单的客户服务渠道。它是企业与客户建立联系、提供卓越体验的关键纽带。然而,传统的呼叫中心运营模式已无法满足日益增长的客户期望和业务需求。这就需要一种全新的解决方案来推动呼叫中心的数字化转型,释放其无限潜能。 信…

QListWidget 插入 item,item显示自定义界面

代码示意: class ItemWidget_action_cfg_w(QWidget):... # 如下方法是在指定item下插入新的item def __do_add_item(self, item):# 获取当前item rowrow self.__list_w.indexFromItem(item).row()# 注意这里没有父类,解释见后面说明new_item QList…

C++类对象模型、类对象的存储方式、this指针、this指针的引出、this指针的特性、C语言和C++实现Stack的对比等的介绍。

文章目录 前言一、C类对象模型1. 类对象的存储方式2. 结构体内存对齐规则 二、this指针1. this指针的引出2. this指针的特性3. C语言和C实现Stack的对比 总结 前言 C类对象模型、类对象的存储方式、this指针、this指针的引出、this指针的特性、C语言和C实现Stack的对比等的介绍…

如何在招聘中开始使用AI?

在人工智能时代,招聘团队面临着“用更少的钱做更多的事情”的压力:用更少的钱和更少的团队。根据一项调查,58%的受访者认为,“提高我们助教团队的效率,降低成本”是明年招聘职位的首要任务。在招聘中使用人工智能是提高…

Excel 如何复制单元格而不换行

1. 打开excle, sheet1右键单击>查看代码>插入>模块 输入代码 Sub CopyText() Updated by NirmalDim xAutoWrapper As ObjectSet xAutoWrapper New DataObject or GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")xAutoWrapper.SetText ActiveC…

东理咨询交流论坛系统

开头语:你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSP技术、B/S架构 工具:MyEclipse 系统展示 首页 管理员功能…

如何利用TikTok矩阵源码实现自动定时发布和高效多账号管理

在如今社交媒体的盛行下,TikTok已成为全球范围内最受欢迎的短视频平台之一。对于那些希望提高效率的内容创作者而言,手动发布和管理多个TikTok账号可能会是一项繁琐且耗时的任务。幸运的是,通过利用TikTok矩阵源码,我们可以实现自…

docker hub仓库被禁用,镜像加速器站点替换

整理 站点整理之前用的daemon.json,现更改镜像加速地址替换自己的docker加速器daemon.json前面加https:// 站点整理 之前用的daemon.json,现更改镜像加速地址 vim /etc/docker/daemon.json{"registry-mirrors": ["https://4xgbe4ey.mirror.aliyuncs.com",…

利用原生HTML + CSS + JS实现歌词滚动

对于很多音乐APP,都有这么一个功能,就是根据歌曲的进度来控制对应的歌词滚动,如下图所示: 大概这样的效果,我此次是使用原生的HTMLCSSJS来实现的,以下是具体的实现过程。 1. 数据获取与处理 对于数据来源&…

揭秘低代码平台:解锁表尾统计方案

前言 在现代Web应用中,数据表格是常见的界面元素之一,用于展示和管理大量的数据。而vxe-table作为Vue.js生态中一款优秀的数据表格组件,提供了丰富的功能和灵活的配置选项,使得开发者可以轻松地构建强大的数据展示界面。 然而&…