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

无人机基本组成部件 阅读详情

概述
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方法就好啦!
在这里插入图片描述

SpringBoot系列之实现一个AI聊天助手 本文介绍了基于Spring Boot框架实现的AI聊天助手项目。该项目使用Spring Boot 3.2.3、Spring AI 1.0.0-M5等技术栈,集成DeepSeek-R1-Distill-Llama-8B模型实现智能对话功能。文章详细介绍了项目配置流程、运行方式和核心代码实现,包括ChatMessage模型类和服务类ChatService的关键功能,如消息处理、历史记录管理和AI响应获取等。读者可通过提供的GitHub链接获取完整代码,快速搭建自己的AI聊天应用。 阅读详情

相关推荐

2022年全球市场微波等离子体CVD反应器总体规模、主要生产商、主要地区、产品和应用细分研究报告

据GIR (Global Info Research)调研,按收入计,2021年全球微波等离子体CVD反应器收入大约 百万美元,预计2028年达到 百万美元,2022至2028期间,年复合增长率CAGR为 %。

MARKETRESEARCH的博客 1137

SSM考证考级

SSM

weixin_53166575的博客 5639

手把手教你用STM32单片机DIY一个简易PLC(附完整电路图与PCB文件)

本文详细介绍了如何利用STM32单片机DIY一个简易PLC控制器,涵盖硬件设计、电路图解析、PCB布局优化及固件框架实现。通过完整的电路图和PCB文件,帮助读者从元器件选型到工业级优化,逐步构建可靠的PLC系统,特别适合工业自动化爱好者和学习者实践。

weixin_42527160的博客 572

IOC控制反转手写实现

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

223

深入解析“PROJ: proj_create_from_database: Cannot find proj.db”错误:从环境配置到打包实战

本文深入解析了“PROJ: proj_create_from_database: Cannot find proj.db”错误的根源与解决方案,涵盖环境配置、PyInstaller打包及跨平台兼容性处理。通过详细分析PROJ库路径问题及GDAL依赖关系,提供动态路径设置、资源文件打包等实战技巧,帮助开发者高效解决地理数据处理中的常见错误。

weixin_29074409的博客 446

(10)Proteus 8.9上的STM32仿真系列(HAL)---freertos

实验设计:通过cubemxide生成freertos工程,然后创建一个 pc13 led灯间隔200ms闪烁的任务。非常遗憾的是proteus8.9仿真失败,实物上没有问题,但还是把流程过一遍。 一、原理图 实物是淘宝上stm32f103 c8t6的核心板,proteus上没有这个芯片,这里图上大概表示一下,用的是核心板自带的pc13引脚的led灯。 二、cubemxide配置 1.RCC如之前工程一样配置 2、配置SYS timebase Source不要使用systick,自己选择一个定时器,我这

qq_35442550的博客 7344

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

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

fighting_yifeng的博客 348

Bode图、ABCD矩阵与EET结合:三步搞定复杂电路传递函数分析

在模拟电路与电源控制设计中,传递函数和频率响应是衡量系统稳定性的核心指标。Bode图以直观的幅频/相频曲线揭示带宽与相位裕度,ABCD二端口矩阵可将级联网络结构化表达,而EET额外元素定理则针对寄生电容、负载效应等局部修正提供显式公式。三者互补,组合成一套从整体拓扑到局部寄生修正的完整分析方法:先用ABCD搭建主体网络,再用EET快速加入额外元件,最后用Bode图验证传递函数和稳定裕度。该方法适用于滤波器设计、电源环路补偿、运放稳定性分析等线性小信号场景,支持Python/SciPy和SPICE交叉验证,显

weixin_32496547的博客 363

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

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

平凡之路 436

新手必看:Infineon Memtools烧录配置全流程(附常见错误解决方案)

本文为嵌入式开发新手提供了Infineon AURIX开发环境搭建与Memtools烧录的全流程实战指南。详细解析了ADS、DAS和Memtools三大核心工具的角色与协同关系,并重点讲解了Memtools的图形界面配置步骤、烧录操作流程,以及针对“无法连接设备”、“编程失败”等常见错误的系统性排查与解决方案,帮助开发者快速上手并规避典型陷阱。

weixin_29189377的博客 635

【WRF-Chem】预处理工具(Preprocessors)总结

预处理工具(Preprocessors)总结

WW、forever的博客 1181

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

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

勇往直前的专栏 822

【ARM Trace32(劳特巴赫) 使用介绍 13 -- Trace32 Var 变量篇】

例如我们已经知道一个符号(可能是变量或者函数)的地址,怎么确定这个地址是一个变量还是一个函数呢?如果是变量的话,变量名是啥?变量定义的位置在哪?如果是函数,函数名是啥?函数定义的位置又在哪呢?查看结构体变量 str_t32 的值。例如我们已经知道了一个符号的地址为。在map文件中的地址为。

CodingCos的博客 2350

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

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

小吉妙妙屋 1611

NTscan扫描工具

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

qq_54432917的博客 709

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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、付费专栏及课程。

余额充值