Spring高手之路-SpringIOC

目录

何为IOC

IOC的优点

Spring的IOC

补充

IOC是如何实现的?


何为IOC

所谓的IOC(inversion of control),就是控制反转的意思。何为控制反转?

在传统的程序设计中,应用程序代码通常控制着对象的创建和管理。例如,一个对象需要依赖其他对象,那么它会直接new出来对象。这样的设计通常被称为 "控制流程"。

而在IOC 中,控制关系发生了反转。控制权被转移到Spring容器中,容器负责创建和管理对象,并在需要的时候将它们注入到应用程序中。

所以,原来这个对象的控制权在我们的代码中,我们自己new的对象,在Spring中,应用程序不再控制对象的创建,而是被动地接受由容器注入的对象。

我们拿代码来举个例子:

下面是一个没有IOC的例子

class A {}
class B {// B需要将A的实例new出来,也就是我们说的控制private A a = new A();public void use() {System.out.print(a);}}

当有了IOC之后

@Component // 说明A自己控制自己,把自己初始化出来,注入给了容器
class A {}class B {// B不需要控制a,直接使用。如果A没有把自己注入给容器,B就不能使用@Resourceprivate A a;public void use() {System.out.print(a);}}

也就是说,没有Spring的话,我们要使用的对象,需要我们自己创建,而有了Spring的IOC之后,对象由IOC容器创建并管理,我们只需要在想要使用的时候从容器中获取就行了。

值得说明的是,IOC只是一种思想和理念,可以有不同的实现方式。

IOC的优点

使用IOC,有最少三个好处:

1.使用者不用关心引用bean的实现细节。

譬如对于B b = new A(c,d,e,f);来说,如果B要使用A,那还要把c,d,e,f多个类全都感知一遍,这显然是非常麻烦且不合理的

2.不用创建多个相同的bean导致浪费。

A a1 = new A();
A a2= new A();

如果a1和a2都引用了A,那么a1和a2就可能new 两个A实例,实际上,我们只需要一个就好了。

3.Bean的修改使用方无需感知。

同样是上面的例子,假如说BeanA需要修改,如果没有IOC的话,所有引用到A的其他bean都需要感知这个逻辑,并且做对应的修改。但是如果使用了IOC,其他bean就完全不用感知到

Spring的IOC

对于Spring的IOC来说,它是IOC思想的一种实现方式。在容器启动的时候,它会根据每个bean的要求,将bean注入到SpringContainer中。如果有其他bean需要使用,就直接从容器中获取即可,如下图所示:

补充

IOC是如何实现的?

使用Spring的IOC容器能力,非常简单,如下代码所示:

ApplicationContext context= new AnnotationConfigApplicationContext("cn.wxxlamp.spring.ioc");
Bean bean = context.getBean(Bean.class);
bean.use();

从上面的代码中,我们也能看出来Spring的IOC是如何实现的:

  1. 从配置元数据中获取要DI的业务POJO(这里的配置元数据包括xml,注解,configuration类等)
  2. 将业务POJO形成BeanDefinition注入到Spring Container中
  3. 使用方通过ApplicationContext从Spring Container直接获取即可。如下图所示:

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

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

相关文章

面试算法77:链表排序

题目 输入一个链表的头节点,请将该链表排序。 分析 归并排序的主要思想是将链表分成两个子链表,在对两个子链表排序后再将它们合并成一个排序的链表。 这里可以用快慢双指针的思路将链表分成两半。如果慢指针一次走一步,快指针一次走两步…

docker-compose部署zabbix服务

1.首先要有docker环境, 关闭防火墙,selinux 开启docker,并设置开机自启动 Linux的docker的安装https://blog.csdn.net/m0_58146415/article/details/134654933 2.docker-compose的安装----github下载 curl -SL https://github.com/docke…

JavaSE语法之十一:接口(超全!!!)

文章目录 1. 概念2. 语法规则3. 接口使用4. 接口特性5. 实现多个接口6. 接口间的继承7. 接口使用实例8. Clonable 接口和深拷贝9. 抽象类和接口的区别(重要!) 1. 概念 在现实生活中的接口比比皆是,如:笔记本上的USB接…

批量抠图软件哪个好用?推荐这三款抠图工具给你

在数字图像处理的世界里,抠图是个不可或缺的环节。对于那些经常需要从复杂背景中提取主体的设计师和摄影师来说,抠图技巧无疑是一项宝贵的职业技能。然而,当面对大量的抠图需求时,手动处理不仅耗时,而且效率低下。因此…

css+js实现鼠标移动边框高亮效果

前言&#xff1a;效果是鼠标移入空白区域&#xff0c;边框高亮的效果。效果是在douyin的渡一教育袁老师的课程学习到的&#xff0c;观看以后是一个实用的小特效。想看的可以平台查询&#xff0c;自己也学到了知识。 <!DOCTYPE html> <html lang"en"> <…

javascript之location常用属性和方法

文章目录 前言为什么使用location的属性和方法呢&#xff1f;属性展示hrefhosthostnameportprotocolpathname 方法展示replace(url)assign(url)reload()toString() 总结属性总结&#xff1a;方法总结&#xff1a; 前言 本章学习的是location常用属性和方法 为什么使用location的…

Wish流量推送规则是什么?wish怎么增加流量?-站斧浏览器

Wish流量推送规则是什么&#xff1f; 个性化推送&#xff1a;Wish采用智能化的算法&#xff0c;根据用户的购物历史、浏览记录、搜索行为等数据&#xff0c;为每位用户推送个性化的商品推荐。这种推送方式能够提高商品与用户的匹配度&#xff0c;从而提高转化率。 价格与销量…

KSO-SAP ABAP调用远程RFC函数详细过程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言RFC几种调用模式1. 同步RFC2. 异步RFC3. 事务性RFC4. 队列RFC5. 并行RFC 一、创建远程链接SM59&#xff08;对方也是sap系统&#xff09;创建目标主机&#xff…

React Hooks 面试题 | 04.精选React Hooks面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

互斥量介绍

队列 环形缓冲区 休眠唤醒 信号量全局整数 休眠唤醒 互斥量全局整数 休眠唤醒 优先级继承 什么叫优先级继承 优先级翻转 也就是C想获得A的锁&#xff0c;但是A的锁还没有被释放&#xff0c;所以C进入了阻塞状态&#xff0c;这时候B就来执行。B一直也没有停下来。所以A也…

【全网最详细】手把手教学Charles抓包工具详细自学教程,完整版安装教程,详细介绍工具栏如何使用及实战案例(建议收藏)

Charles抓包工具 【1】Charels简介【2】Charles安装Charles客户端下载下载安装完成后激活Charles配置苹果系统操作 【3】什么是证书&#xff1f;为何需要证书&#xff1f;http协议是不安全的使用对称秘钥进行数据加密非对称秘钥加密小技巧 【4】Charles 乱码解决办法1.解决resp…

2023-12-29 工作心得补充 适时抽取方法,让代码变简洁

1 JSONObject 实际上是个map 2 数据库实际上也是map 只不过map 是竖着写&#xff0c;数据库横着写. 3 像 用户名 密码 这种后续可能随时会改的&#xff0c;不要写死在代码里&#xff0c;都写成nacos参数。 4 方法的抽取 让代码变得简洁 可读性很高。这是方法抽取的秘诀。写文…

鸿蒙开发之崩溃信息收集FaultLogger

前申&#xff1a;果然系统的API没有让我失望&#xff0c;日志完全看不出来崩溃原因所在 一、使用 logCrash() {FaultLogger.query(FaultLogger.FaultType.JS_CRASH,(err,val) > {if (err) {console.log(fault log get an errJSON.stringify(err))return}let len val.lengt…

SpringBoot+AOP+Redis 防止重复请求提交

本文项目基于以下教程的代码版本&#xff1a; https://javaxbfs.blog.csdn.net/article/details/135224261 代码仓库: springboot一些案例的整合_1: springboot一些案例的整合 1、实现步骤 2.引入依赖 我们需要redis、aop的依赖。 <dependency><groupId>org.spr…

大厂整理的23年前端工程师面试手册,高频面试题终结篇,github上标星16k!

前端开发所需掌握知识点概要&#xff1a; HTML&CSS&#xff1a;浏览器内核、渲染原理、依赖管理、兼容性、CSS语法、层次关系&#xff0c;常用属性、布局、选择器、权重、CSS盒模型、Hack、CSS预处理器、CSS3动画 JavaScript&#xff1a; 数据类型、运算、对象、Function、…

【JavaWeb学习-第四章(2)】前后端分离开发 前端工程化

文章目录 1. 前后端分离开发1.1. 介绍1.2. YAPI1.2.1. YAPI 介绍1.2.2. 接口文档管理 3. 前端工程化3.1. 介绍3.2. 前端工程化入门3.2.1. 环境准备3.2.1.1. NodeJS安装3.2.1.2. Vue-cli 安装 3.2.2. Vue项目简介3.2.2.1. 创建vue项目3.2.2.2. vue项目之目录结构介绍3.2.2.3. 运…

Python高级用法:生成器(generator)

生成器&#xff08;generator&#xff09; 生成器是一种返回生成序列的方法&#xff0c;与直接使用列表等方式返回序列的方式不同的是&#xff0c;他的生成可以是无限的。 生成器可以与next搭配使用&#xff0c;可以被看作是一种特殊的迭代器。 yield语句 yield一般与循环相…

CNAS中兴新支点——源代码审计对企业有哪些好处?

源代码扫描&#xff0c;对应用程序进行静态漏洞扫描&#xff0c;分析源代码中存在的安全风险&#xff0c;运行应用于模拟器中对应用进行实时漏洞攻击检测。 你是否了解源代码扫描对企业的好处&#xff1f; 一、源代码扫描&#xff0c;通常能够帮助企业解决这些问题&#xff1…

pycharm用Pipenv创建项目

一、pipenv介绍 pipenv是一个python的包管理工具&#xff0c;提供python的各个版本间的管理&#xff0c;各种包管理。官网 pipenv主要有以下特点&#xff1a; pipenv集成了pip&#xff0c;virtualenv两者的功能。pipenv会在项目根目录下创建Pipfile文件用于记录包的版本信息…

unity exe程序置顶和全屏

1.置顶和无边框 设置显示位置和范围 using System; using System.Runtime.InteropServices; using UnityEngine; public class WindowMod : MonoBehaviour {public enum appStyle{FullScreen,WindowedFullScreen,Windowed,WindowedWithoutBorder}public enum zDepth{Normal…