学习总结与分享-spring篇之IOC(控制反转)浅析

CentOS7下Node.js v20+安装与常见依赖库问题解决指南 本文详细介绍了在CentOS7系统下安装Node.js v20+的完整流程及常见依赖库问题的解决方案。通过升级glibc到2.28+、配置环境变量以及处理libstdc++版本问题,帮助开发者顺利在老旧系统上部署最新版Node.js,提升开发效率。 阅读详情

概述
IOC 的作用:
解耦、单例缓存、Bean生命周期管理、父子容器
IOC 工作要经历2个过程:
启动预加载BeanDefination、实例化对象且缓存单例,传统BeanFactory的实现类是懒加载(loadClass时再实例化bean),而web容器实现是预加载(启动和实例化一起进行)。但是BeanDefination都是预加载的。
IOC的作用
1、解耦:
实现了类与类依赖关系的解耦,大家都注册在IOC容器当中,并不直接强耦合。有多种注入类的方式:xml配置、@Component 注解、@import、@Configuration等等
实现了类的依赖关系和代码的解耦:把类的依赖关系,可以不通过修改代码,而是通过修改 xml然后容器来实现,这给非开发人员带来了很多便利
2、单例缓存:
基于容器注册,就可以灵活缓存,避免内存空间的浪费,提升创建bean的速度。如果通过new的方式,就无法做到。
3、预处理:
对Bean生成进行干预(init、构造函数、属性赋值、对象销毁)等过程进行干预
4、父子容器:
MVC的实现就是很好的例子,既有一定的隔离性,又可以复用父容器的类

IOC容器启动和创建Bean逻辑
在这里插入图片描述

总体逻辑:
IOC容器启动时,把所有配置过的Bean都全部各自生成一个BeanDefinition,并存储到BeanDefinitionRegistry的beanDefinitionMap中;用户在通过BeanFactory接口的实现类去getBean的时候,会从beanDefinitionMap中获取到这个bean的BeanDefinition,然后通过反射生成一个Bean,默认单例的话,还会把这个实例化的bean存储在singletonObjects中,下次再getBean的时候就直接从singletonObjects中返回

  1. 在IOC容器启动的时候,去扫描指定的application.xml,从而获取到需要注册的Bean的信息,不管你后期会不会用到这个Bean,所有扫到的Bean都会各自封装成一个BeanDefinition
  2. 因为Spring默认是懒加载,只有程序getBean的时候才会真正的实例化这个Bean,而实例化Bean的时候需要知道这个Bean的BeanDefinition(因为BeanDefinition里面有这个Bean的所有相关信息),所以需要BeanDefinitionRegistry这个BeanDefinition的管理器,来判断这个Bean是否已经注册生成了BeanDefinition,否则只有遍历所有创建过的BeanDefinition,才能知道你要get的这个Bean是否已经生成BeanDefinition
  3. BeanDefinitionRegistry接口主要负责管理所有注册过的BeanDefinition,比如增删改查功能,他的实现类需要2个工具成员变量:
  4. beanDefinitionMap、singletonObjects(都是ConcurrentHashMap结构)
  5. beanDefinitionMap负责缓存所有注册过的BeanDefinition;singletonObjects为单例类的缓存器,每个通过BeanDefinitionRegistry创建出来的bean,都缓存在singletonObjects里面,除非是多例
  6. 而BeanFactory接口是面向用户的,实际上他只是一个触发器,用户调用getBean方法,会先去beanDefinitionMap查找这个Bean是否已经生成了BeanDefinition,没有就报错,有就根据BeanDefinition来反射创建一个Bean,因为默认是单例的,创建完之后就缓存在singletonObjects里面

Spring getBean流程的细节

  1. 缓存查询:查询singletonObjects中是否有缓存
  2. 实例化DependsOn的类:查询类A是否是dependsOn的类,有的话,需要先实例化dependsOn的类
  3. 创建一个空的实体类:读取BeanDefinition信息,获取空的构造函数,通过反射创建一个所有filed为null的实体类(这样在堆中就有一个引用了)然后把这个Bean保存到singletonFactories中(以参数的形式 把bean存到factory里面)
  4. 然后遍历该类A的依赖属性,一一赋值,如果属性值依赖的是某一个具体的类B的时候,就必须先实例化B类
  5. 最后把创建好的Bean缓存在singletonObjects中,再返回给调用者

Spring 生命周期管理
实例化Bean执行顺序:
调用构造函数、属性值的set方法、init方法(如果配置了的话)、destory方法
类通过实现特定的接口,来实现在某个过程中进行干预
Spring 也支持配置容器级别的 干预类,注入到IOC当中后,所有的类在创建过程中,都会收到干预
普通Java Bean的生命周期
比如main方法里面,new User()这个操作,就会从class文件里面加载一个User对象到JVM里。
JavaBean的生命周期:
类加载、连接、验证、准备、初始化
其中包括类静态成员变量的初始化为默认值
静态成员变量设置为设置值或者静态代码块的执行
调用构造函数

另外Java 加载Bean的触发条件:
1、new的方式直接创建
2、 当前类的静态属性或者静态方法被调用
3、该类作为父类被加载等等

下面就根据所涉及到的思路,自己模拟手写一个简单版的IOC容器,实现其中的读取配置文件,控制反转,依赖注入的核心功能
主要实现思路
1、标识:创建自定义的注解(带有我们自定义注解的类才进行对象的实例化和装配);
@Component @Service @AutoWired UserDao,UserService

2、读取:需要读取用户配置文件;(用户可自定义哪些包需要进行扫描bean的装配);
component-scan
loadScanPath();

3、扫描:扫描文件进行类加载(根据用户的配置扫描对应的包加载对应包里面的class放到一个容器里面);
beanClassMap
loadBeanClass();

4、创建:把扫描出来的class中带有自定义注解的类和属性分别进行实例化和属性注入;
beanMap
registerBean();
dependency();

5、封装:把实例化好的对象放到一个容器里并提供调用方法;
ApplicationContext.getBean();

代码展示
创建一个maven项目并创建放自定义注解的包名,创建自定义注解,名字自取
在这里插入图片描述
在这里插入图片描述
其他的类似,代表的含义不同。。。

新建配置文件,指明要扫描的包路径和读取配置文件的方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据包路径扫描类,加载类,并把含有指定注解的类生成的类全限定路径储存在容器里:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据set集合里面所有的类路径,生成对象放在核心容器中(Map集合),并把对象属性中含有自定义autowired的注解进行依赖注入:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加一个执行上述所有步骤的方法,每次实例化核心容器对象时,都会执行该方法:
在这里插入图片描述
在这里插入图片描述
提供一个getBean方法,当实例化核心对象后,可以根据类名来获取该类的对象:
在这里插入图片描述
最后,让我们实例化核心对象执行main方法就好啦!
在这里插入图片描述

STM32F103C8T6实战:从零搭建三相SPWM逆变器(附MATLAB仿真、PCB、源码) 本文详细介绍了如何使用STM32F103C8T6单片机从零搭建三相SPWM逆变器,涵盖硬件选型、PCB设计、SPWM算法实现及MATLAB仿真。项目提供完整的工程文件,包括源码、PCB设计和仿真模型,适合电子工程师和学生进行实践学习。通过本教程,读者可以掌握逆变器设计的核心技术和调试方法。 阅读详情

相关推荐

Synopsys工具链实战:如何用VCS、DC、ICC和Calibre跑通你的第一个数字IC设计项目?

本文详细介绍了如何使用Synopsys工具链(VCS、Design Compiler、ICC和Calibre)完成数字IC设计项目,从RTL代码到GDSII版图的全流程。涵盖环境配置、RTL设计验证、逻辑综合、物理实现及签核验证等关键步骤,帮助工程师掌握高效的数字IC设计流程。

weixin_42525005的博客 198

SSM考证考级

SSM

weixin_53166575的博客 5639

如何利用GMS构建地下水数值模拟模型?

第一步:点图中三维网格的图标然后点Grid→Create Grid这个界面是用于创建一个有限差分网格的设置窗口。它允许你定义网格在三维空间中的范围、分辨率以及其他相关属性。这个界面提供了一个直观的方式来定义一个三维的有限差分网格,你需要指定每个维度上的范围、划分的单元格数量,以及一些控制单元格大小分布和网格方向的参数。这个网格通常会被用于数值模拟,例如地下水流模拟。在点击 "OK" 之前,请务必仔细检查所有参数是否符合你的建模需求。1. X-Dimension (X 轴维度)2. Y-Dimension (

weixin_44259522的博客 2094

IOC控制反转手写实现

把对下端对象的依赖转移到第三方容器(工厂+配置文件+反射),传统应用中国,对象是我们手动控制new出来的,IOC中是容器控制对象的创建,帮我们new出来的,对象只是被动的接收依赖对象,因此称为反转。DI依赖注入:依赖注入就是能做到构造某个对象时,将依赖的对象自动初始化并注入。构造函数注入用的最多,默认找参数最多的构造函数,可以不用特性,可以去掉对容器的化。IOC控制反转:传统开发,上端依赖(调用/指定)下端对象,会有依赖。三种注入方器:构造丽数注入--属性注入--方法注入(按时间顺序)

223

Unity分包下载实战:AssetBundle+CDN+热更新全链路指南

分包下载是移动应用资源管理的核心技术,本质是将大体积安装包拆解为按需加载的独立资源单元,以解决用户安装意愿低、首屏启动慢、热更新不可控等关键问题。其底层依赖资源打包机制(如Unity AssetBundle)、全球分发网络(CDN)与安全热更新策略三者协同。AssetBundle提供资源隔离与依赖管理能力,CDN保障低延迟高可用下载,而热更新策略则决定版本控制、灰度发布与异常恢复的工程鲁棒性。该方案广泛应用于中重度游戏、大型工具类App及需要频繁内容迭代的商业项目,直接提升次日留存、过审成功率与用户在线时长

weixin_29762151的博客 355

手把手教你为智能手表DIY一个离线导航:LVGL + SD卡地图实战

本文详细介绍了如何为智能手表DIY一个离线导航系统,结合LVGL图形库和SD卡地图数据。从硬件选型、地图数据处理到LVGL地图引擎实现,提供了完整的实战指南,特别适合户外运动爱好者和嵌入式开发者。文章还分享了功耗优化、性能提升等实用技巧,帮助读者打造高效的离线导航解决方案。

weixin_42570484的博客 206

手写spring框架篇三IOC控制反转

IOC控制反转 在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 为什么说是控制:传统程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建以及外部资源获取(不只是对象包括比如文件等)。 为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象:由容器帮我们查找及注入

fighting_yifeng的博客 348

使用Dify打造视频生成工作流:从提示词到视频的完整指南

Dify作为开源LLM应用开发平台,通过可视化工作流编排实现从文本到视频的端到端生成,将创意周期从天级缩短至分钟级。核心流程包括提示词工程、视频API调用、存储分发和结果反馈。

牛奶夹心巧克力 3435

spring学习--总结IOC(控制反转)

--IOC(控制反转) 是一种概念,一种思想 解耦合 通过spring容器管理和装配对象,不用自己手动创建对象 1.依赖注入(DI) (1)基于XML的DI 注意:id是唯一的,class是类的全限定类名,不能是接口 必须提供对应的setter方法 a.设值注入(无参构造方法) i.简单类型数据 ii.引用类型数据 b.构

平凡之路 436

SAP交货单增强字段更新实战:手把手教你用BAPI_OUTB_DELIVERY_CHANGE和EXTENSION2参数

本文详细解析了如何使用BAPI_OUTB_DELIVERY_CHANGE和EXTENSION2参数实现SAP交货单增强字段的更新。从增强点SMOD_V50B0001的定位到字段落表的全流程,提供了ABAP代码示例和常见问题排查方法,帮助开发者高效完成交货单自定义字段的集成开发。

weixin_42525637的博客 454

六自由度机械臂运动学分析及其轨迹规划

六自由度机械臂轨迹规划 通过对比三次多项式插值法与五次多项式插值法的效果,选取后者对机械臂进行轨迹规划,将运动学解导入Matlab Robotics Toolbox仿真,得到各关节角度、速度和加速度与时间关系曲线。 三次多项式插值法 三次多项式有4个待定系数,可同时对起始点和目标点的角度和角速度给出约束条件。 数学公式 MATLAB代码 五次多项式插值法 五次多项式有6个待定系数,可同时对起始点和...

两条眉毛 6万+

Spring IOC 知识点总结,写得太好了!

广义的 IOC 在这之前,我们先记住一句话。好莱坞原则:Don’t call me, we will call you.即“不用打电话过来,我们会打给你”。 控制反转(Inversion of Control,简称 IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称 DI),还有一种方式叫“依赖查找”(Dependency Lookup)。 通过控制反转,对象在被创建的时候,由一个调控系统内所有对.

勇往直前的专栏 822

ThingsBoard 3.1.1版本在window本地运行之TB-Gateway服务搭建(三)

TB-gateway服务是TB不可或缺的部分,很多的协议都需要TB-gateway来做分类处理,今天我们就来做TB-Gateway服务搭建。

晚点遇见你,余生都是你! 2474

【Spring篇】简述IoC入门案例,DI入门案例

简述IoC入门案例,DI入门案例

小吉妙妙屋 1611

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring中ioc的实现原理

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。 IOC理解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/bl

qq_43842093的博客 7193

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【IoC控制反转】从0开始学习Spring(1)

控制反转(IOC)是一种软件开发模式,它通过将依赖关系的创建和管理责任交给外部容器,实现了组件之间的解耦和灵活性。在IOC中,组件不再负责自己的依赖对象的创建,而是依赖容器来提供所需的依赖对象。

qq_54432917的博客 709

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring详解(二)IOC控制反转

IOC -Inversion of Control,即控制反转。它不是什么技术,而是一种设计思想。控制:在Java中指的是对象的控制权限(创建、销毁)反转:指的是对象控制权由原来 由开发者在类中手动控制 反转到 由Spring容器控制。传统的创建对象的方法是直接通过 new 关键字,而 spring 则是通过IOC容器来创建对象,也就是说我们将创建对象的控制权交给了 IOC容器。

RZM666的博客 1023

Spring学习总结——Spring实现IoC的多种方式

一、Spring框架概述 1.1、资源 1.2、Spring历史 1.3、框架特征与功能 1.4、Spring组成 1.5、Spring Boot与Spring Cloud 二、IoC基础 三、使用XML配置的方式实现IOC 3.1、使用无参构造方法创建对象 3.2、使用有参构造方法创建对象 3.3、通过属性赋值 3.4、对象引用 3.5、对象作用域 3.6、延迟初始化bean 四、使用Spring注解配置IOC 4.1、修改BookDAO 4.2

m0_68850571的博客 3439

Spring IOC/DI和AOP

一、分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846 1.1、IoC是什么   Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Jav...

程序小白进阶之路 6274

什么是IOC(控制反转)、DI(依赖注入)

原文地址(摘要了部分内容):https://blog.youkuaiyun.com/qq_22654611/article/details/52606960/ 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC...

qq_42709262的博客 8万+

【技术分享】-Spring的IOC

Spring的IOC一. 什么是控制反转,为什么叫控制反转 控制反转:就是把原先我们代码里面需要自己手动实现的对象创建、依赖的代码,反转给容器来帮忙实现。 IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关心业务逻辑本身就可以了。从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI)。 二. IOC依赖注入的方式有哪些?主要有三种注入方式

惜暮 1252

IOC控制反转与DI

简要介绍spring,IOC,DI,传统工厂

希望我的博客对你有帮助 840

Spring核心探秘:控制反转(IOC)的实战心得

要使用Spring的IOC,首先需要在项目中引入Spring的相关依赖。这通常是通过在项目的构建文件(如Maven的pom.xml或Gradle的build.gradle)中添加Spring的依赖来实现的。接下来,就是IOC的实战部分了。我将通过一些示例代码来展示如何使用Spring的IOC。在Spring中,我们可以通过XML配置文件或者注解的方式来定义Bean。在这里,我们使用了@Component注解来告诉Spring:“嘿,这个类是我的Bean,你帮我管管。

m0_37643701的博客 708

详解spring的IOC控制反转和DI依赖注入

转载 详解spring的IOC控制反转和DI依赖注入 ...

weixin_44137282的博客 1400

谈谈对Spring IOC的理解

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。 一、分享Iteye的开涛对Ioc的精彩讲解   首先要分享的是Iteye的开涛这位技术牛人

MyCode学习笔记 23万+

Spring——控制反转(IOC)与依赖注入(DI)

本篇文章我们学习Spring的重要知识点,控制反转(IOC)和依赖注入(DI)...

HuoZhiyan 的博客 1186
上一篇: 学习总结与分享-dubbo的了解与初步使用
下一篇: 学习总结与分享-Spring IOC容器的常用注解与生命周期
VolcanoWec
博客等级 码龄8年 0粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值