Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring源码系列:依赖注入(四)-总结

Spring源码系列:依赖注入(四)-总结

作者头像
磊叔的技术博客
发布于 2025-06-07 07:09:31
发布于 2025-06-07 07:09:31
770
举报
  • Spring源码系列:依赖注入(一)getBean
  • Spring源码系列:依赖注入(二)createBean
  • Spring源码系列:依赖注入(三)-属性注入

在上面三篇文章中对依赖注入做了一个大致的梳理;里面都是大量代码的分析,本文在此基础上进行一个总结归纳。

依赖注入调用过程

如前几篇文章所述,依赖注入是由getBean来触发的;然后涉及到bean实例的创建、依赖关系的建立、属性注入等子过程。

  • getBean 方法触发依赖注入
  • doGetBean 从容器中查找Bean(BeanFactory链,当前容器->双亲容器-双亲容器…)

当然,在获取到某个Bean的时候也会通过递归的方式来依赖注入依赖的bean

  • createBeanInstance 生成了Bean所包含的Java对象,Spring中用SimpleInstantiationStrategy类来生成Bean对象的实例,实例化Java对象的方法有两种(CGlib是默认方式):
    • 通过BeanUtils,它使用了JVM的反射功能来生成Java对象实例
    • 用CGLIB来生成,CGLIB是一种常用的字节码生成器的类库
  • populateBean 设置Bean对象的依赖关系
  • resolveValueIfNecessary 注入类型的处理;解析不同类型的属性
  • setPropertyValues 属性注入

关于lazy-init

Ioc容器的初始化过程中,主要的工作就是对BeanDefinition的定位、载入、解析和注册;但是就像之前说过的,此时依赖注入还没有发生。在Spring源码系列:依赖注入(一)getBean文中提到,依赖注入发生在应用第一次向容器获取Bean的时候;也就是上面说到的通过getBean来触发。

当然,依赖注入也可以在容器初始化的过程中就完成。这个就是lazy-init属性的存在意义了。就是说我们可以通过设置Bean的lazy-init属性来控制预实例化的过程。

预实例化:在初始化容器时完成Bean的依赖注入

这种做法的好处在于提高了我们第一次获取Bean的的效率,但是它也降低了容器初始化的速度。(这个其实很好理解的,因为第一次获取Bean的时候,依赖注入已经完成了,直接拿过来用就行)

关于lazy-init属性的处理也是在wac.refresh这个方法中完成的,具体是在finishBeanFactoryInitialization方法中。如果继续追溯的话,最终是交给DefaultListableBeanFactory容器中的preInstantiateSingletons方法中完成。

lazy-init这种实例化方式就是通过将依赖注入委托给容器来处理,而不是在用户第一向容器申请的Bean的时候完成依赖注入,不同的阶段,也有不同的优劣。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磊叔的技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring源码系列:核心概念解析
本文旨在为读者解析Spring源码中的关键类,以便读者在深入阅读源码时,能够了解关键类的作用和用途。在阅读Spring源码时,经常会遇到一些不熟悉的概念,了解关键类的作用可以帮助读者更好地理解这些概念。
努力的小雨
2024/04/28
1370
22.手绘Spring DI运行时序图
当Spring loC容器完成了 Bean定义资源的定位、载入和解析注册以后,loC容器中已经管理类Bean 定义的相关数据,但是此时loC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况 发生:
编程之心
2020/08/12
7530
Spring源码系列:依赖注入-引言
在前面文章中大概分析了一下Bean的载入,其实这个过程就是在Ioc容器中建立BeanDefinition的数据映射。但是对于Bean的实例化并未涉及,在之前的分析中也提到,bean的实例化是在依赖注入是才具体完成。
磊叔的技术博客
2025/06/07
810
Spring源码系列:依赖注入-引言
Spring源码系列:依赖注入(二)createBean
在Spring源码系列:依赖注入(一)(AbstractBeanFactory-getBean)最后说道getBean是依赖注入的起点,bean的创建都是通过createBean来完成具体的创建的。createBean的具体实现是在AbstractAutowireCapableBeanFactory中的。本篇就捋一捋这个方法看下bean的创建过程。
磊叔的技术博客
2025/06/07
930
Spring源码系列:依赖注入(二)createBean
Spring IOC源码解读
Spring IOC源码解读 此文讲解非常详细,内容较多,请耐心看完,谢谢 讲解内容: 一、 什么是Ioc/DI? 二、 Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三、 IoC容器的初始化 1、 XmlBeanFactory(屌丝IOC)的整个流程 2、 FileSystemXmlApplicationContext 的IOC容器流程 2.1、高富帅IOC解剖 2.2、 设置资源加载器和资源定位 2.3、AbstractApplicationCont
Java帮帮
2018/03/15
1.5K0
Spring IOC源码解读
Spring核心原理之 IoC容器中那些鲜为人知的细节(3)
Spring IoC容器还有一些高级特性,如使用lazy-init属性对Bean预初始化、使用FactoryBean产生或者修饰Bean对象的生成、IoC容器在初始化Bean过程中使用BeanPostProcessor后置处理器对Bean声明周期事件进行管理等。
Tom弹架构
2021/12/27
3530
Spring源码核心知识点凝练总结
IOC全称 Inversion Of Control ,意为控制反转,通过IOC容器,我们把对象或者组件的创建过程透明化;我们无需关注创建细节,我们只需要把创建对象,属性赋值,这些工作交给IOC容器完成即可。
大忽悠爱学习
2023/03/14
7080
Spring源码核心知识点凝练总结
Spring源码系列:依赖注入(一)(AbstractBeanFactory-getBean)
在Spring源码系列:BeanFactory的创建文章中我们谈到了BeanFactory这容器,这个里面提供了注入的实现接口。其具体的实现还需要从AbstractBeanFactory和DefaultListableBeanFactory中来看。今天就先撸一下AbstractBeanFactory这个类中的getBean这个方法。
磊叔的技术博客
2025/06/07
860
Spring源码系列:依赖注入(一)(AbstractBeanFactory-getBean)
这次彻底搞懂IoC容器依赖注入的源码
初始化的过程,主要完成的工作是在容器中建立 BeanDefinition 数据映射,并没有看到容器对Bean依赖关系进行注入。
JavaEdge
2021/10/18
4280
Spring源码-循环依赖(附25张调试截图)
Spring 在哪些情况下会出现循环依赖错误?哪些情况下能自身解决循环依赖,又是如何解决的?本文将介绍笔者通过本地调试 Spring 源码来观察循环依赖的过程。
草捏子
2020/08/10
6900
Spring源码-循环依赖(附25张调试截图)
Spring源码分析(九)lazy-init 在Spring中是怎么控制加载的
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化(也就是依赖注入)。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的singleton bean。通常情况下这是件好事,因为这样在配置中的任何错误就会即刻被发现(否则的话可能要花几个小时甚至几天)。
石臻臻的杂货铺[同名公众号]
2021/07/14
5220
Spring源码系列:依赖注入(三)-属性注入
前面文章中对依赖注入的触发和bean的创建做了学习记录,本文将来记录一下bean的属性注入过程。Bean的属性注入发生在BeanDefinitionValueResolver这个类中,BeanDefinitionValueResolver这类是用于bean工厂实现的Helper类,职责就是将bean定义对象中包含的值解析为应用于目标bean实例的实际值。
磊叔的技术博客
2025/06/07
980
Spring源码系列:依赖注入(三)-属性注入
Spring IoC容器的依赖注入1 getBean触发的依赖注入2. lazy-init属性和预实例化
初始化的过程,主要完成的工作是在容器中建立 BeanDefinition 数据映射,并没有看到容器对Bean依赖关系进行注入 假设当前IoC容器已经载入用户定义的Bean信息,依赖注入主要发生在两个阶段 正常情况下,由用户第一次向IoC容器索要Bean时触发 但我们可以在 BeanDefinition 信息中通过控制 lazy-init 属性来让容器完成对Bean的预实例化,即在初始化的过程中就完成某些Bean的依赖注入的过程 1 getBean触发的依赖注入 BeanFactory 是最原始的 ioc 容
JavaEdge
2018/05/16
1.2K0
spring源码分析(一)IOC管理Bean
通过最简单的IOC 容器来跟踪一下 IOC是怎么管理Bean的;Spring IoC容器对Bean定义资源文件的定位,载入、解析和依赖注入的分析
石臻臻的杂货铺[同名公众号]
2021/07/14
4030
【源码分析】Spring依赖注入原理
在Spring中提供了三种实现依赖注入的方式:字段注入、构造器注入、Setter方法注入。
百思不得小赵
2022/12/01
8780
【源码分析】Spring依赖注入原理
Spring源码解析(五):循环依赖
在完成Bean的实例化后,属性注入之前Spring将Bean包装成一个工厂对象添加进了三级缓存中,对应源码如下:
Java微观世界
2025/01/21
5390
Spring源码解析(五):循环依赖
原向Spring大佬低头--大量源码流出解析
       用Spring框架做了几年的开发,只停留在会用的阶段上,然而Spring的设计思想和原理确实一个巨大的宝库。大部分人仅仅知道怎么去配,或着加上什么属性就能达到什么效果,这些东西都可以通过查文档,查google来解决。关键是在怎么理解它,把它的思想变为自己的东西。博主这几天没有学习(装逼),感觉心里甚是空虚,索性研究了下一直很好奇的Spring大佬,毕竟写代码天天都在用。         前方高能,非战斗人员迅速投入战斗:         1.Spring IOC容器         2.App
我叫刘半仙
2018/04/16
9880
原向Spring大佬低头--大量源码流出解析
Spring官网阅读系列(三):自动注入与精确注入
在看下面的内容之前,我们先要对自动注入及精确注入有一个大概的了解,所谓精确注入就是指,我们通过构造函数或者setter方法指定了我们对象之间的依赖,也就是我们上篇文章中讲到的依赖注入,然后Spring根据我们指定的依赖关系,精确的给我们完成了注入。那么自动注入是什么?我们看下面一段代码:
秃顶的Java程序员
2020/03/25
7510
Spring源码解析(五)Spring 加载bean 依赖注入
至此,我们分析过后,可以简单的归纳一下Spring IOC容器的过程 一、Resource定位过程 这个Resource定位指的的是BeanDefinition的资源定位,他由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供了统一接口,对于这些BeanDefinition的存在形式,相信大家都不会感到陌生,比如,在类路径中的Bean定义信息可以使用FileSystemResouce来进行抽象;在类路径中的Bean定义信息可以使用前面提到的ClassPathResource来使用,等待;这个定位过程类似于容器寻找数据的过程,就像用水桶装水先要把水找到一样;
石臻臻的杂货铺[同名公众号]
2021/07/14
6810
从Spring源码探究AOP代码织入的过程
AOP是OOP的延续,是Aspect Oriented Programming 的缩写,意思是面向切面编程。
向着百万年薪努力的小赵
2022/12/02
4770
从Spring源码探究AOP代码织入的过程
相关推荐
Spring源码系列:核心概念解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档