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

C#实战:如何用winmm.dll打造毫秒级高精度定时器(附完整代码) 本文详细介绍了在C#中利用winmm.dll实现毫秒级高精度定时器的完整方案。针对.NET内置定时器精度不足的问题,通过调用timeSetEvent等原生API,提供了超越系统时钟中断周期的精准定时能力。文章包含核心原理剖析、完整的封装类代码以及音视频处理、游戏开发等场景下的实战应用与性能调优指南。 阅读详情

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

配置xen上VM混杂模式,使其能捕获物理网络流量 本文目的:配置VM和xen相应的物理网卡(pif)和虚拟网卡(vi 阅读详情

相关推荐

音频DSP开发中的‘隐藏关卡’:那些SigmaStudio未公开的模块计算秘籍

本文深入探讨音频DSP开发中SigmaStudio未公开的模块计算秘籍,重点解析动态范围控制、均衡器参数映射和混响算法优化等核心模块计算公式。通过实际案例揭示如何利用这些非官方技巧提升音频质量与系统性能,为ADI DSP开发者提供宝贵的实战经验。

water的专栏 911

SSM考证考级

SSM

weixin_53166575的博客 5639

若依框架-实现管理端与用户端的不同页面布局

我们现在要做的是:管理员登录时展示后台管理端,普通用户登录时展示我们自己写的页面。所以我们可以用v-if来判断登录用户的角色,如果用户角色包含admin,说明是管理员,渲染管理端相关组件,否则渲染用户端组件。不过若依作者的本意还是想退出系统后清空角色信息,所以为了保险期间,我们可以在退出系统后,延迟2秒,再单独清空角色信息。当我们登录管理端后,再退出登录,会有那么一瞬间渲染用户页面,然后才是回到登录界面。这个时候,前端检测到角色信息为空,不包含admin,于是就会渲染用户页面。用来延迟 2 秒执行。

m0_74462339的博客 1566

IOC控制反转手写实现

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

223

TikTok滑块验证码verifyV2逆向实战:从fp生成到captchabody加密的完整流程解析

本文详细解析了TikTok滑块验证码verifyV2的逆向工程全流程,从fp参数生成到captchabody加密机制,涵盖了验证码触发、WASM解密、轨迹模拟等关键技术点。通过实战案例和代码示例,帮助开发者深入理解反爬机制,提升逆向工程能力,应对复杂的验证挑战。

weixin_28568819的博客 478

新手避坑指南:用镭神C32和KVH 1750 IMU做标定,为什么直接上lidar_align会失败?

本文详细解析了使用镭神C32激光雷达和KVH 1750 IMU进行标定时常见的失败原因及解决方案。从IMU的微分传感器特性到Lidar-IMU标定的数学本质,再到可行的标定方案和实操注意事项,帮助新手避开认知陷阱,掌握正确的标定方法。

weixin_30162121的博客 327

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

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

fighting_yifeng的博客 348

Nvidia Orin Driveos Camera 介绍及调试详解

自动驾驶-nvidia orin driveos Camera 驱动详解及调试

u011803281的博客 2992

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

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

平凡之路 436

Qt —— 百度地图 - 3、Qt调用高德在线地图功能示例(附源码)

Qt - 地图相关 —— 3、Qt调用高德在线地图功能示例(附源码)

498

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

天天酷科研的博客 1114

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

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

勇往直前的专栏 822

【人工智能之深度学习】15. 工业时序预测实战:LSTM与TCN融合的装备故障预警系统设计与实现

摘要:工业装备故障预警是智能制造领域的核心技术之一,其通过分析传感器时序数据实现故障提前预测,可显著降低运维成本并提升设备可靠性。本文针对工业时序数据多源异构、非平稳性、噪声干扰及样本不平衡等挑战,提出一种LSTM与TCN融合的故障预警架构——利用TCN捕捉局部时序特征,结合注意力增强LSTM建模长期依赖关系,通过门控机制实现特征自适应融合。以3MW风电齿轮箱为研究对象,设计包含数据预处理、特征工程、模型训练及部署的完整流程,实验结果表明,该融合模型准确率达94.6%,故障预测提前量较单一模型提升30%以上

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1443

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

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

小吉妙妙屋 1611

廖雪峰Python教程[完整版]

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

qq_54432917的博客 709

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

Spring核心之控制反转(IOC)

如何理解IoC Spring Bean是什么 IoC Container管理的是Spring Bean, 那么Spring Bean是什么呢? 本人整理各种Java核心知识点与多家公司面试知识点整理 免费分享给大家,我认为是非常有用的,想要资料的话请点 白嫖这份礼物←戳我 Spring里面的bean就类似是定义的一个组件,而这个组件的作用就是实现某个功能的,这里所定义的bean就相当于给了你一个更为简便的方法来调用这个组件去实现你要完成的功能。 IoC是什么 Ioc—Inversion ..

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值