Spring IOC (自动装配,依赖注入)

Spring中的IOC详解 单例Bean和多实例Bean的生命周期主要区别在于实例化和销毁的管理方式,单例Bean在容器启动时创建一个实例,并由容器负责管理其生命周期的完整过程。在Spring框架中,Bean是应用程序的核心组件,它们由Spring容器创建、组装和管理,以帮助开发者实现松耦合、可测试和可维护的代码。IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。Bean的自动装配是Spring框架提供的一种便捷的方式,用于自动解析和设置Bean之间的依赖关系,而无需显式配置每一个依赖关系的方式。 阅读详情

广义的IOC

1. IoC(Inversion of Control) 控制反转;

两种实现: 依赖查找(DL)和依赖注入(DI);

IOC 和 DI 、DL 的关系(这个 DL,Avalon 和 EJB 就是使用的这种方式实现的 IoC):

2. DL 已经被抛弃,因为他需要用户自己去是使用 API 进行查找资源和组装对象。即有侵入性。

3. DI 是 Spring 使用的方式,容器负责组件的装配。

注意:Java 使用 DI 方式实现 IoC 的不止 Spring,包括 Google 的 Guice,还有一个冷门的 PicoContainer(极度轻量,但只提供 IoC)。

Spring的IOC

Spring 的 IoC 设计支持以下功能:

1. 依赖注入

2. 依赖检查

3. 自动装配

4. 支持集合

5. 指定初始化方法和销毁方法

6. 支持回调某些方法(但是需要实现 Spring 接口,略有侵入)

其中,最重要的就是依赖注入,从 XML 的配置上说, 即 ref 标签。对应 Spring RuntimeBeanReference 对象。

对于 IoC 来说,最重要的就是容器。容器管理着 Bean 的生命周期,控制着 Bean 的依赖注入。

那么, Spring 如何设计容器的呢?

Spring 作者 Rod Johnson 设计了两个接口用以表示容器。

1. BeanFactory

2. ApplicationContext

BeanFactory 粗暴简单,可以理解为就是个 HashMap,Key 是 BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。我们可以称之为 “低级容器”。

ApplicationContext 可以称之为 “高级容器”。因为他比 BeanFactory 多了更多的功能。他继承了多个接口。因此具备了更多的功能。

例如资源的获取,支持多种消息(例如 JSP tag 的支持),对 BeanFactory 多了工具级别的支持等待。所以你看他的名字,已经不是 BeanFactory 之类的工厂了,而是 “应用上下文”, 代表着整个大容器的所有功能。

该接口定义了一个 refresh 方法,此方法是所有阅读 Spring 源码的人的最熟悉的方法,用于刷新整个容器,即重新加载/刷新所有的 bean。

当然,除了这两个大接口,还有其他的辅助接口,但我今天不会花太多篇幅介绍他们。

为了更直观的展示 “低级容器” 和 “高级容器” 的关系,我这里通过常用的 ClassPathXmlApplicationContext 类,来展示整个容器的层级 UML 关系。

有点复杂? 先不要慌,我来解释一下。

最上面的 BeanFactory 知道吧?我就不讲了。

下面的 3 个绿色的,都是功能扩展接口,这里就不展开讲。

看下面的隶属 ApplicationContext 粉红色的 “高级容器”,依赖着 “低级容器”,这里说的是依赖,不是继承哦。他依赖着 “低级容器” 的 getBean 功能。而高级容器有更多的功能:支持不同的信息源头,可以访问文件资源,支持应用事件(Observer 模式)。

通常用户看到的就是 “高级容器”。 但 BeanFactory 也非常够用啦!

左边灰色区域的是 “低级容器”, 只负载加载 Bean,获取 Bean。容器其他的高级功能是没有的。例如上图画的 refresh 刷新 Bean 工厂所有配置。生命周期事件回调等。

我们可以看看一个 IoC 启动过程是什么样子的。说白了,就是 ClassPathXmlApplicationContext 这个类,在启动时,都做了啥。

下图是 ClassPathXmlApplicationContext 的构造过程,实际就是 Spring IoC 的初始化过程。

注意,这里为了理解方便,有所简化。

这里再用文字来描述这个过程:

1. 用户构造 ClassPathXmlApplicationContext(简称 CPAC)

2. CPAC 首先访问了 “抽象高级容器” 的 final 的 refresh 方法,这个方法是模板方法。所以要回调子类(低级容器)的 refreshBeanFactory 方法,这个方法的作用是使用低级容器加载所有 BeanDefinition 和 Properties 到容器中。

3. 低级容器加载成功后,高级容器开始处理一些回调,例如 Bean 后置处理器。回调 setBeanFactory 方法。或者注册监听器等,发布事件,实例化单例 Bean 等等功能,这些功能,随着 Spring 的不断升级,功能越来越多,很多人在这里迷失了方向 :)。

简单说就是:

(1) 低级容器 加载配置文件(从 XML,数据库,Applet),并解析成 BeanDefinition 到低级容器中。

(2) 加载成功后,高级容器启动高级功能,例如接口回调,监听器,自动实例化单例,发布事件等等功能。

所以,一定要把 “低级容器” 和“高级容器” 的区别弄清楚。不能一叶障目不见泰山。

好,当我们创建好容器,就会使用 getBean 方法,获取 Bean,而 getBean 的流程如下:

从图中可以看出,getBean 的操作都是在低级容器里操作的。其中有个递归操作,这个是什么意思呢?

假设:当 Bean_A 依赖着 Bean_B,而这个 Bean_A 在加载的时候,其配置的 ref = “Bean_B” 在解析的时候只是一个占位符,被放入了 Bean_A 的属性集合中,当调用 getBean 时,需要真正 Bean_B 注入到 Bean_A 内部时,就需要从容器中获取这个 Bean_B,因此产生了递归。

为什么不是在加载的时候,就直接注入呢?因为加载的顺序不同,很可能 Bean_A 依赖的 Bean_B 还没有加载好,也就无法从容器中获取,你不能要求用户把 Bean 的加载顺序排列好,这是不人道的。

所以,Spring 将其分为了 2 个步骤:

1. 加载所有的 Bean 配置成 BeanDefinition 到容器中,如果 Bean 有依赖关系,则使用占位符暂时代替。

2. 然后,在调用 getBean 的时候,进行真正的依赖注入,即如果碰到了属性是 ref 的(占位符),那么就从容器里获取这个 Bean,然后注入到实例中 —— 称之为依赖注入。
可以看到,依赖注入实际上,只需要 “低级容器” 就可以实现。

所以 ApplicationContext refresh 方法里面的操作不只是 IoC,是高级容器的所有功能(包括 IoC),IoC 的功能在低级容器里就可以实现。

总结

说了这么多,不知道你有没有理解Spring IoC? 这里小结一下:IoC 在 Spring 里,只需要低级容器就可以实现,2 个步骤:

1. 加载配置文件,解析成 BeanDefinition 放在 Map 里。

2. 调用 getBean 的时候,从 BeanDefinition 所属的 Map 里,拿出 Class 对象进行实例化,同时,如果有依赖关系,将递归调用 getBean 方法 —— 完成依赖注入。

上面就是 Spring 低级容器(BeanFactory)的 IoC。

至于高级容器 ApplicationContext,他包含了低级容器的功能,当他执行 refresh 模板方法的时候,将刷新整个容器的 Bean。同时其作为高级容器,包含了太多的功能。一句话,他不仅仅是 IoC。他支持不同信息源头,支持 BeanFactory 工具类,支持层级容器,支持访问文件资源,支持事件发布通知,支持接口回调等等。

可以预见,随着 Spring 的不断发展,高级容器的功能会越来越多。

诚然,了解 IoC 的过程,实际上为了了解 Spring 初始化时,各个接口的回调时机。例如 InitializingBean,BeanFactoryAware,ApplicationListener 等等接口,这些接口的作用;

但是请注意,实现 Spring 接口代表着你这个应用就绑定死 Spring 了!代表 Spring 具有侵入性!要知道,Spring 发布时,无侵入性就是他最大的宣传点之一 —— 即 IoC 容器可以随便更换,代码无需变动。而现如今,Spring 已然成为 J2EE 社区准官方解决方案,也没有了所谓的侵入性这个说法。因为他就是标准,和 Servlet 一样,你能不实现 Servlet 的接口吗?

ADS使用Smith圆图进行阻抗匹配 在处理RF系统的实际应用问题时,总会遇到一些非常困难的工作,对各部分级联电路的不同阻抗进行匹配就是其中之一。一般情况下,需要进行匹配的电路包括天线与低噪声放大器(LNA)之间的匹配、功率放大器输出(RFOUT)与天线之间的匹配、LNA/VCO输出与混频器输入之间的匹配。匹配的目的是为了保证信号或能量有效地从“信号源”传送到“负载”。 阻抗匹配(impedance matching) 信号源内阻与所接传输线的特性阻抗大小相等且相位相同,或传输线的特性阻抗与所接负载阻抗的大小相等且相位相同,分别称为传输线的输 阅读详情

相关推荐

【Labview与SQL Server互联(labview可以引用数据库)】

Labview与SQL Server互联

Magize的博客 3586

Spring IOC、DI

Spring IOCIoC(Inversion of Control) 控制反转Spring 作者 Rod Johnson 设计了两个接口用以表示容器。Spring IOC的初始化过程(AC的构造过程)Get Bean的具体流程总结 IoC(Inversion of Control) 控制反转 Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 两种实现方式: 依赖查找...

HhhyXiao 265

LTE信令流程——切换

LTE信令流程 切换 切换是由基站发起的,不同于小区重选,小区重选是由UE发起的。 基站利用移动性管理算法给UE下发测量任务,在RRC重配置消息中携带MeasConfig信元给UE下发测量配置 切换有三种场景: 同一基站内不同小区的切换 不同基站间基于X2的切换(MME不变) 不同基站间基于S1的切换(MME/SGW可能改变) 1. 同一基站内不同小区的切换 连接态的UE在一个基站的不同小区之间移动 UE上报合适的测量报告(Measure Reports),触发基站切换 基站下发切换命令给UE,

Hxx的博客 1万+

Ioc和依赖注入和自动装配

依赖注入DI:显式注入,构造器注入和setter注入 自动装配autowire: 1 beans的default-autowire:bean设置了autowire则用自己的,否则用beans的default-autowire 2 < bean id=“auto” class=“example.autoBean” autowire=“byType”/>,默认为no(不自动装配) 3 @A......

kobexzf的博客 439

探针卡技术演进:从金线微针到MEMS探针的Wafer Sort革命

本文探讨了探针卡技术从传统金线微针到MEMS探针的演进,及其对晶圆测试(Wafer Sort)的革命性影响。随着芯片焊垫间距进入45微米以下,MEMS技术凭借其超高精度、超长寿命和卓越的信号完整性,成为应对高密度、高速及3D IC测试挑战的关键,显著提升了测试效率与稳定性。

lstm7chronicler的博客 365

RK3568开发板Debian系统屏幕旋转终极指南:从临时调整到永久设置

本文提供了RK3568开发板在Debian系统下实现屏幕旋转的完整解决方案。从使用xrandr命令进行临时调整,到修改X11配置文件实现永久设置,详细讲解了操作步骤与核心原理。指南还涵盖了多屏异显配置、触摸屏坐标校准等进阶技巧,帮助开发者彻底解决显示方向问题。

weixin_29181861的博客 389

三、Spring中的依赖注入与自动装配

1.为实体类添加构造方法 2. 修改配置文件 1.2 拓展Lombok idea安装插件文件➡️设置➡️插件,搜索Lombok引入依赖​ 中央仓库地址:https://mvnrepository.com/ 修改实体类 其他说明 1.3 自定义类型 定义idcard类,生成构造方法等。 实体类user中添加private IdCard idcard属性,并更新构造方法。 xml方式一 xml方式二 1.4 日期类型date 方式一对于dete对象同样利用其构造方法。 方式二 1.5

老去的90后 1339

YOLOv8n轻量化实战:10分钟打通实时摄像头目标检测,附参数调优与避坑指南

本文介绍了如何快速入门YOLOv8目标检测框架,通过摄像头实战实现实时检测。YOLOv8凭借轻量化架构和跨平台优势,是新手入门的理想选择。文章详细讲解了环境搭建(1分钟完成)、核心代码逻辑(3分钟掌握)以及性能调优技巧(3分钟进阶),提供可直接运行的代码示例。重点包括:模型选择(优先yolov8n.pt)、摄像头参数优化、置信度阈值调整、检测类别指定等实用技巧,帮助开发者快速实现10-15FPS的实时检测效果,并针对不同场景提供优化建议。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 370

03-Spring-DI源码分析

Spring-DI源码分析 依赖注入发生时间 当Spring IOC容器完成了Bean定义资源的定位、载入和解析注册以后,IOC容器中已经管理了Bean定义的相关数据,但是此时IOC容器还没有对所管理的Bean进行依赖注入,依赖注入在一下两种情况发生: 用户第一次调用getBean()方法时,IOC容器触发依赖注入。 当用户在配置文件中将<bean>元素配置了lazy-init=fa...

weixin_39169791的博客 293

【机器学习】随机森林(Random Forest,简称 RF):预测光伏电站功率 || 缺失数据处理 || 重复行处理...

【机器学习】随机森林(Random Forest,简称 RF):预测光伏电站功率。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1649

小米15修复“NV损坏” 去除主板校验电阻步骤解析与图示

小米15系列将搭载骁龙8至尊版处理器,采用台积电3nm工艺。文章分析了手机出现"NV损坏"故障的表现及修复方法,包括通信异常、系统启动问题等典型症状,并介绍了去除主板校验电阻和刷写工程固件两种修复方案。重点讲解了去除主板电阻后刷写QCN文件的操作流程,强调在维修过程中需要结合分析与思考。适用于小米15系列特定机型(24129PN74G/I/C)的硬件修复。

小马哥的专栏 313

Spring详解依赖注入与自动装配

详解依赖注入与自动装配 在我面试的时候,常会问面试者一个问题,就是依赖注入有几种方式,发现面试者的回答五花八门,有回答两种的,也有回答三种的,四种的。 其实正确的答案是两种:构造器注入和setter注入。 提到依赖注入,就不能不说装配。有些初学者总是会把这两个概念搞混,这个博文就是来跟大家讨论这两个概念以及其中详细的原理。 依赖注入的本质就是装配,装配是依赖注入的具体行为,这就是两者的关系。例如: <bean id="hello" class="com.maven.Hello"><cons

Chrians的博客 3571

按照CANoe模板制作seed&&key.dll

在canoe进行诊断测试的时候,在0x27服务中需要制作一个dll文件。可在canoe的诊断中进行加载,也可用于diva的自动化测试。 本文按照canoe提供的KeyGenDll_GenerateKeyEx模板制作。 KEYGENALGO_API VKeyGenResultEx GenerateKeyEx( const unsigned char* iSeedArray, /* Array for the seed [in] */ unsigned int

天赐好车的博客 6521

【Spring】——Spring概述、IOC、IOC创建对象的方式、Spring配置、依赖注入(DI)以及自动装配知识

【Spring】——Spring概述、IOC、IOC创建对象的方式、Spring配置、依赖注入(DI)以及自动装配知识

shsjssnn的博客 1312

计算机控制技术及应用

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

spring IoC : DI依赖注入;自动装配;使用注解注入;使用Java的方式配置Spring

一、Spring IOC IoC(Inversion of Control,控制反转)是一种设计思想。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。 Spring 的 IoC 设计支持以下功能: 依赖注入 依赖检查 自动装配 支持集合 指定初始化方法和销毁方法 支持回调某些方法(但是需要实现 Spring 接口...

y_Engineer的博客 1009

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring IOC概述—依赖注入,集合注入,SPEL,自动装配

1.Spring IOC是什么  Ioc—Inversion of Control,即“控制反转”,是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。简言之,就是使用对象的时候不再“随用随new”,也不用new一个对象然后给它赋值,这些通过IOC容器都能由系统自动生成。 2.Spring IOC优点 1. 轻量级 2. 依赖注入 3. ...

S500783的博客 472

Spring入门 IOC理论,第一个spring程序Di依赖注入,Bean的自动装配

简介 spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。 Spring的组成 Spring Core 核心容器 核心容器提供Spring框架的基本功能,Spring以bean的方式组织和管理java应用的各个组件和关系 使用BeanFactory来产生和管理Bean SpringCont

weixin_43869261的博客 269

Java Spring 框架技术从入门到放弃:Spring生态之Spring 的 IoC依赖注入的自动装配(Autowiring)学习笔记

Java Spring 框架技术从入门到放弃:Spring生态之Spring 的 IoC依赖注入的自动装配(Autowiring)学习笔记

zl515035644的博客 791

NO.8 Spring IOC 依赖注入—自动装配

NO.8 Spring IOC 依赖注入—自动装配 语法:&lt;bean id="..." class="..." autowire="byType"/&gt; autowire:表示自动装配,会自动从IOC容器中寻找名称为属性名的bean ID 。 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans x

qq_40616042的博客 251

SSM:二、spring笔记(一):IOC(反转控制)、DI(依赖注入)、自动装配、作用域

IOC:反转控制、DI:依赖注入、自动装配、作用域IOC:控制反转DI:依赖注入自动装配作用域 IOC:控制反转 控制反转:类之间的关系,不用代码控制,而是由spring容器来控制,由定义的xml文件来控制, 控制权由代码翻转到容器里 表现形式:在初始化对象时,在代码无需写new,而是把类之间的关系写到配置文件中去,从下方的代码可以看出初始化SpingTest1,无需使用new对象。 DI:依赖注...

weixin_40961551的博客 260

spring 学习01--IOC控制反转--DI依赖注入--bean自动装配autowire

Spring学习01 IOC 控制翻转,之前的对象的创建,管理是由程序来控制的,现在对象由Spring来创建、管理和装配 hellospring 编写类 public class User { String str; public String getStr() { return str; } public void setStr(String str) { this.str = str; } @Override

xpc1998的博客 173

【JavaEE学习笔记】Spring_02_IoC/DI依赖注入,集合对象属性注入,自动装配,代理模式

Spring_02 A.IoC/DI依赖注入 1.控制反转和依赖注入的概念 IoC实现由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控 控制权由应用代码中转到了外部容器,控制权的转移,是所谓控制反转 可供选择的IoC 容器: Apache Avalon、PicoContainer 和 HiveMind Avalon 从没怎么流行,尽管它很强大而且有很长的

love__nana 538

Spring下IOC容器和DI(依赖注入) @Bean及@Autowired自动装配

@Bean及@Autowired自动装配Bean及自动装配Bean是什么?自动装配是什么? Bean及自动装配 本篇文章是关于我对Bean相关知识的学习和理解。学习过程中参考了很多资料,文末有详细地址。(这里只说明@注解方式,在xml中配置道理相同) Bean是什么? bean在spring中可以理解为一个对象。理解这个对象需要换一种角度,即可将spring看做一门编程语言,@Bean是sprin...

zyww的博客 1万+

第6天学习打卡(Spring:简介、IOC理论基础、HelloSpring、IOC创建对象的方式、Spring配置、依赖注入、引用的Bean的自动装配、使用注解开发注册bean和属性注入)

1.Spring 1.1 简介 Spring:春天 ==>给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架 2004年,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版 Rod Jahnson是悉尼大学的音乐学博士,专业不是计算机 Spring理念:使现有技术更加实用,本身就是一个大杂烩,整合现有的框架技术 官网:https://spring.io 官方下载地址:repo.spring.io Gi

joseph的博客 904

Spring IoC容器与Bean管理23:使用注解方式实现Spring IoC四:自动装配注解(对象依赖注入);自动装配注解之【按名称装配注解】(@Resource)的使用;

(1)通过【Spring IoC容器与Bean管理22:使用注解方式实现Spring IoC三:自动装配注解(对象依赖注入);自动装配注解之【按类型装配注解】(@Autowired)的使用和缺点;】已经知道,【自动装配注解】中的【按类型装配注解】有一些问题;为了解决这个问题,在实际工作中,推荐使用【自动装配注解】中的【按名称装配注解】; (2)【自动装配注解】中的【按名称装配注解】,主要就是@Resource注解; @Resource:这个注解出现的较早,是JSR-250提供的标准,是业界的...

小枯林的博客 575

第83天学习打卡(Spring IOC理论推导 HelloSpring IOC创建对象的方式 Spring配置 DI依赖注入)Bean的自动装配

2.IOC理论推导 1.UserDao接口 2.UserDaoImpl实现类 3.UserService业务接口 4.UserServiceImpl实现类 在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果程序代码量十分大,修改一次的成本代价十分昂贵。 我们使用一个Set接口实现 package com.kuang.service; import com.kuang.dao.UserDao; public class UserServiceImpl imple

doudoutj的博客 161
上一篇: Spring AOP(代理模式及实践)
下一篇: SpringMVC(设计模式原理)
一尾鲫鱼
博客等级 码龄9年 7粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值