深入理解 Srping IOC

什么是 Spring IOC?

IOC 全称:Inversion of Control,翻译为中文就是控制反转,IOC 是一种设计思想,IOC 容器是 Spring 框架的核心,它通过控制和管理对象之间的依赖关系来实现依赖注入(Dependency Injection),依赖注入是 IOC 的具体实现方式,它通过将对象的依赖关系通过构造函数、setter 方法或字段注入到对象中,从而实现了对象之间的解耦和灵活性,所谓 IOC ,其实就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系。

控制反转之灵魂拷问

  • 谁控制谁:在传统开发模式下,我们需要什么对象就 new 什么对象,也就是说需要依赖的对象自己来创建,而使用了 Spring IOC 容器之后,对象的创建销毁则有 IOC 容器来控制 ,也就是说 IOC 容器控制了对象。
  • 控制了什么:IOC 容器控制了对象及生命周期。
  • 何为反转:反转就是由开发者去创建维护对象,反转为交给 Spring IOC 容器去维护对象,开发者维护对象是主动的,Spring IOC 容器去维护对象之后,再获取对象就是被动的了,由主动获取变为被动获取,也就是反转的由来。
  • 反转了什么:对象的获取反转了,依赖的对象由主动获取变为被动获取,IOC 容器来帮对象找相应的依赖对象并注入,而不是由对象主动去找。

方便更好的理解 IOC,用图例简单说明一下

传统开发模式,所需要的对象都是自己主动创建,然后自己代码显式注入的,如图所示:

在这里插入图片描述

使用了 Spring IOC 模式,不在需要主动去创建这些对象了,也不需要自己代码显式注入直接从容器中获取即可,如图所示:

在这里插入图片描述

什么是依赖注入(DI,Dependency Injection)?

Dependency Injection 翻译为中文就是依赖注入,前面我们说了依赖注入是 IOC 的具体实现方式,依赖注入用于实现类之间的解耦和依赖关系的管理,通过依赖关系将对象的创建和维护转移到 IOC 容器中进行,使得对象的使用者不需要关心对象的创建和维护,依赖注入并没有给系统带来更多的功能,只是为系统搭建了一个灵活和扩展的平台,有了依赖注入,我们只需要进行简单配置,就可以完成业务实现,提高了开发效率。

依赖注入(DI,Dependency Injection)之灵魂拷问

  • 谁依赖谁:因为应用程序不在关心对象的创建和维护,直接从 IOC 容器中获取对象,显然是应用程序依赖 IOC 容器。
  • 为什么要依赖:知道了谁依赖谁,也就知道了为什么要依赖,因为应用程序不在关注对象的创建和维护,而又要使用对象,IOC 容器中有维护好的对象,自然要依赖 IOC 容器来获取对象。
  • 谁注入谁:IOC 容器注入应用程序需要的对象。

依赖注入(DI,Dependency Injection)的方式?

  • 属性注入:一个注解搞定,写法简单,但是不能注入 final 修饰的属性,违反单一职责原则,也不能在其他容器中使用,只能用于 IOC 容器。
  • setter 注入:setter注入就是使用 Java 的 set 方法配合注解将 Bean 注入到当前类中,不能注入final修饰的对象,注入的对象可能会被修改(因为 set 方法可以被多次调用,有修改的风险,所以注入的对象就可能被修改),,,,,,,,。
  • 构造方法注入:利用构造方法将 Bean 注入到当前类中,构造方法注入如果类只有一个构造方法,可不不用加注解,是因为 Spring 在设计的时候,使用构造方法注入且只有一个构造方法,Spring 就会将对象注入到当前类中,给这个属性进行赋值,因此可以省略注解 @AutoWired。
  • 接口方式注入:接口方式注入不是太友好,因为它需要被依赖的对象实现不必要的接口,有很大的侵入性,一般不建议使用。

IOC容器的优点和缺点?

优点:

  • 解耦:通过 IOC 容器,我们可以不同组件之间的解耦,提高了应用程序的加灵活、可维护和可扩展。
  • 可配置:IOC 容器提供了一种统一的配置方式,可以更加方便地管理和配置应用程序中的各个组件。
  • 依赖注入:IOC 容器自动完成依赖注入,帮我们管理了对象的创建和维护及依赖关系,不需要应用程序去关心这些,简化了开发工作。
  • 延迟加载:IOC 容器可以根据需要延迟加载组件,减少应用程序的启动时间和内存消耗。

缺点:

  • 对象创建不可见:IOC 容器帮我们完成了对象的创建和维护,使的整个过程不可见。
  • 效率相对较低:IOC 底层是使用反射去创建对象的,在效率上会有所消耗。

总结:本文对 Srping IOC 的概念有了深入理解,知道了Srping IOC 到底帮我们做了什么,但是对 Srping IOC 的底层实现逻辑还没有进行剖析,后面会继续分析 Srping IOC 的底层实现机制,欢迎持续关注。

欢迎提出建议及对错误的地方指出纠正。

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

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

相关文章

无人机在测绘领域的应用

你知道吗?无人机在测绘领域的应用已经掀起了一场技术革命! 🚀它不仅可以高效完成测绘任务,还能在恶劣环境下工作,真是测绘界的超级英雄啊! 想象一下,无人机像一只自由翱翔的鸟儿,在…

正点原子[第二期]ARM(I.MX6U)裸机篇学习笔记-1.2

前言: 本文是来自哔哩哔哩网站上视频“正点原子[第二期]Linux之ARM(MX6U)裸机篇”的学习笔记,在这里会记录下正点原子Linux ARM MX6ULL 开发板根据配套的哔哩哔哩学习视频所作的实验和笔记内容。本文大量的引用了正点原子哔哔哩网…

结构体内存对齐(未完成版)

前言 我们已经掌握了结构体的基本使用了。 现在我们深入讨论一个问题:计算机构体的大小。 这也是一个特别热门的考点:结构体内存对齐 练习导入 对齐规则

electron ipcRenderer.invoke 和 ipcMain.handle 介绍

ipcMain.handle 是 Electron 主进程中的一个方法,用于处理从渲染进程发送过来的 IPC 请求,并返回一个 Promise。渲染进程可以使用 ipcRenderer.invoke 方法发送 IPC 请求到主进程,并等待主进程处理完成后返回结果。 在主进程中 (main.ts)&am…

Python构建学生信息管理系统:前端页面开发

Python构建学生信息管理系统:前端页面开发 在本系列博客的前几篇中,我们详细介绍了学生信息管理系统(SIMS)的需求分析、环境搭建、工程初始化、数据库设计、后端逻辑以及安全设计。在本文中,我们将专注于前端页面的开…

材质系统:关于PBR(Physically Based Rendering)需要知道的一些事

目录 前言 1. 什么是PBR? 2. 为什么PBR在近期开始流行 3. PBR材质与其他渲染器中材质(如Vray材质、Enscape中的材质)的区别是什么? 4. 为什么Vray之类的渲染器从一开始没有使用PBR材质系统? 前言 本文内容基于对图…

vue项目npm run build 打包之后如何在本地访问

vue项目npm run build 打包之后如何在本地访问 如果直接访问时,则会报错如下的信息: 报错码: Access to script at file:///D:/assets/index-DDVBfHVo.js from origin null has been blocked by CORS policy: Cross origin requests are on…

【转载】如何在MacBookPro上把Ubuntu安装到移动硬盘里过程记录

以下主要目的是记录安装过程中的问题,安装步骤等信息怕忘记 环境信息: Mac :macOS High Sierra 10.13.6 内存8G(Swap时用到) Ubuntu: ubuntu-22.04.4-desktop-amd64.ios 金士顿U盘:Kingston-64G 烧录软件:balenaEtcher…

牛客NC371 验证回文字符串(二)【简单 双指针 C++/Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/130e1a9eb88942239b66e53ec6e53f51 思路 直接看答案,不难参考答案C class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可…

Atlassian Jira 信息泄露漏洞(CVE-2019-3403) 排查思路

Atlassian Jira: 企业广泛使用的项目与事务跟踪工具,被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 简述: 近日发现多个内网IP触发的Atlassian Jira 信息泄露漏洞的告警。 告警的检测规…

openvoice v2 声音克隆使用案例

参考: https://github.com/myshell-ai/OpenVoice/blob/main/docs/USAGE.md https://www.wehelpwin.com/article/4940 安装 1)下载OpenVoice项目安装 2)MeloTTS安装 参考:https://blog.csdn.net/weixin_42357472/article/details/136320097 pip install git+https://gith…

python读取文件

定义: python提供了读取任何文件的一种方法,可以读取计算机磁盘中文件中的数据 前提: 1,得准备一个文件 2,读取文件: 方式一: 文件模式: r:只读(read) w:写入(write) a:添加(add) 文…

记录不熟悉的函数用法(C++)——insert

2. insert 记录起因:接上一篇的例子,不知道为什么使用insert进行插入之前要先执行clear操作,非得这么做吗?我可以认为这个clear操作是对应于为空字符串的,可是仍然纠结insert它具体插入的位置,在后面追加还…

Sentinel 与 Hystrix:云原生时代的故障隔离与服务降级

在面对高流量和复杂的分布式系统时,保障服务的稳定性和可用性是至关重要的。故障隔离和服务降级是两种常用的技术手段,用来保护系统在面临故障或压力过大时仍能稳定运行。在这方面,Sentinel 和 Hystrix 是两个广泛使用的库,它们虽…

2398.预算内最多的机器人数目

我第一个手搓的hard的单调队列题目......灵神yyds 思路解析: 我做的时候感觉这个题目有点歧义,我以为他的连续运行是时间上连续,所以我开始写的代码是选择最多的子序列(可以不连续),使得不超过budget,这个求最多子序列的代码会在最后给出,不保证完全正确(因为没有太多测试点),…

element-ui et -i 编译默认主题报错:ReferenceError: primordials is not defined

报错信息如下 fs.js:40 } primordials;^ ReferenceError: primordials is not defined导致这个问题的原因:node和gulp版本冲突!! 我使用的是node 14版本 解决方法: 看了好几个帖子,都推荐使用node 11.15.0版本&am…

华为ensp中BGP(边界网关协议)基础原理及配置命令

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月27日10点04分 BGP(边界网关协议)是一种路由协议,用于在互联网中的不同自治系统(AS)之间交换路由信息。它…

WordPress外贸独立站如何提高询盘转化率

一、引言 在当今全球化日益加剧的商业环境中,外贸业务已成为众多企业寻求增长的重要途径。而WordPress作为一款强大且易于操作的建站平台,被广大外贸企业所青睐,用于构建自己的独立站。然而,仅仅拥有一个WordPress外贸独立站并不…

eCognition 分类

目录 前言 一、阈值分类 1、创建自定义特征 2、查看对象特征值 3、阈值分类 3.1 新建类别(如果已有类别即跳过) 3.2、建立分类阈值规则 4、导出分类结果 5、附录:如果需要合并结果、按以下步骤 二、监督分类 1、方法1:利用classification算法(主要用于最邻近)…

芯片安全(security)

芯片安全包括什么 芯片安全是为了防止芯片数据和程序遭遇非法攻击和访问等导致数据错误或者信息泄露或者非正常运行? 比如指纹信息被泄露;PC被植入非法挖矿程序;非法修改ddr中的数据等。 1.在子系统级别看到的axprot[1]和nsaid(non-securit…