图解 Spring Bean 生成流程,非常详尽

SPRING-BOOT启动流程--图解 Spring-Boot启动流程是一个初问较多的梗故事开篇内容提要本次内容排布第一部分:启动main到initialize第二部分:stopWatch到context功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 故事开篇 你好!S 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

3feb3c536b38243acbf9b6d96242c572.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

来源:blog.youkuaiyun.com/u011709538/
article/details/129303025


很多人把spring的相关内容当作背八股文,认为只在面试时能用上,实际开发根本用不到。实际上早期的我也是这么想的,但随着开发年限的增长,解决了越来越多的难题后,不得不承认,这些基础知识的学习有着无法替代的作用。

就拿我实际遇到的一个例子来说:

有一个大型项目因为安全漏洞的原因要进行升级,需要从springboot1.0升级至springboot2.0,但发现springboot2的默认动态代理方式为CGLIB,而项目上很多地方利用的jdk代理对接口做了增强,切换至CGLIB导致了大量问题。根据百度的内容,设置了proxy-target-class=“false”,然而不起作用,最后发现是某一个三方包内设置了proxy-target-class=“true”,而这个属性只要在工程里任何地方设置过一次true,都会导致代理管理器的同名属性为true,最终采用CGLIB代理,那么有什么简单方式可以解决这个问题

先卖个关子,还是让我们一起学学Bean的生成吧

1引言

作为javaboy的必修课,spring一路伴随着开发者;同样的,也一路伴随着开发者面试,重要性不言而喻,我们经常遇见的问题比如:

  • 代理对象是何时生成的?

  • 循环依赖是怎么解决的?

  • 能说说对Springr容器三级缓存的理解吗?

以上问题,都离不开对bean生成流程的熟悉与理解。但是不得不谈,目前网上文章鱼龙混杂,一些偏颇错误的分析四处流传,我们后面会提到一些常见谬传。至于现在,现在先和我们一起,深入的看下springBean的生成逻辑吧

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

2创建Bean的极简流程

我们开门见山,直接以单例对象为例子,说一个Bean的极简流程以及其目的

  1. 获取Bean定义

扫描工程内所有被标记的Bean,获取其类型,名称,属性,构造方法等信息,存在一个Map里

  1. 生成实例

这一步也很简单,遍历上述Map,利用Bean定义里的无参构造方法创建对象,和new 对象同理

  1. 属性装填

刚创建的对象所有属性都是默认值,需要我们给它装填上需要的内容

  1. 初始化

如果这个Bean实现了InitializingBean接口,则会调用你写在afterPropertiesSet方法里的内容。

到此,一个Bean就创建完毕了,是不是很简单?是的,很简单,逻辑也很清晰。

当然,上面四步是核心功能,Spring为了增强对这些Bean的修改能力,在2-生成实例 3-属性装填 4-初始化的前后都预留了处理点,Spring自己或用户都可以通过编写==Bean后置处理器(BeanPostProcessor)==来实现自己的目的,这些处理器会在对应的处理点被执行,从而完成对Bean的修改,下面会详细讲一下

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

3后置处理器(PostProcessor)

Spring中的后置处理器分为两大类:

  • 一类是针对Bean工厂的BeanFactoryPostProcessor

  • 一类是针对Bean的BeanPostProcessor

以上两者都是接口,Spring已经给定了一些实现类,用户也可以自己写一些实现类来实现全局的Bean相关的操作;顾名思义,BeanFactoryPostProcessor针对Bean工厂(它还有个子接口BeanDefinitionRegistryPostProcessor),调整Bean工厂的属性、影响Bean定义,注意此时还没有Bean进行实例化。BeanPostProcessor则更直接的作用于Bean实例生成过程中的修改。

BeanFactoryPostProcessor

很多人不知道在实际项目中这个处理器有什么用,好像我们不需要对Bean工厂或者Bean做什么改动吧?大部分项目确实不需要,但很多时候,我们需要添加一些自定义的Bean,或者出于项目需要,改动一些Spring原生Bean属性时就用的上了。

比如我们常用的myBatis组件,我们会在mapper层的接口上写@Mapper注解,最后就会在Spring中生成对应的Bean对象,然而这里有一个问题:

@Mapper注解不是Spring规定的Bean注解,怎么被扫描进容器的?

自然是依托于BeanFactory后置处理器。mybatis中写有工厂后置处理器的实现

74bc8c7ed7df295c9b548554175a3305.png

看名字也知道,这个处理器起了扫描的作用,找到了被我们标记的接口,并“捏造”一个Bean定义,并把Bean的类型设置为MapperFactoryBean.class,即工厂类,然后把它添加到Bean定义注册器中。

而在我们需要实例化这个Bean的时候,mybatis又会从这个工厂对象中使用getObject()为我们取出一个Bean实例,这个Bean实例是使用我们写的Mapper接口产生的代理,而后再把这个代理放入Spring容器

7c4b0056ff395f7be5eaae08bfb34cc2.png

BeanPostProcessor

而Bean后置处理器则更加常见,种类也更丰富,他们的详细作用和工作时机都可以在下图中看到

2c527f72c03188e31a3207afcbe1f5aa.png

契机问题的解决

让我们回到契机里提到的那个问题,这个问题简化的讲,其实就是有这么一个Spring内部的Bean名字为org.springframework.aop.config.internalAutoProxyCreator,它有一个属性proxy-target-class,这个属性决定了Spring动态代理的生成用的jdk动态代理还是CGlib,然而在很多地方(三方包)已经给他赋值。

我们必须在它被其他三方包赋值后 ,把它的属性值改为false。这个问题最终怎么做到的呢?就是利用了后置处理器,此处使用工厂后置处理器找到该Bean定义,修改其Bean属性

449122c9f8f5cc7d49d2fdb4d6a994bb.png

4引用与缓存

从上面看,似乎创建一个Bean只需要四步(忽略后置处理器的步骤),十分简单。确实,如果我们的项目只需生成一个Bean,那只要按序完成这四步就可以了。

但实际上,Spring本身和我们的项目要生成的Bean数量远不止一个,复杂的项目一般会达到上千个Bean,Bean之间还有复杂的引用关系。我们不仅要存储这些Bean,还必须考虑到这些引用情形,从而引入缓存的机制。

引用已有的Bean

2cbeb6f82ecabae7718976aead486660.png

如图,上述是一种最简单的引用,Parent 里面引用了 Child ,。理想的情况下,我们先创建了Child并保存起来,那么在创建Parent的时候,直接引用现成的Child就好(此处用@DependsOn保证这种顺序)。那么这时我们可以说,容器只需要使用一级缓存,就像养鸡场里饲养着许多鸡,这个缓存里存的就是各个现成的Bean,直接取用即可。

引用未创建的Bean

上述的Parent 里面引用了 Child案例,只是一种理想情况,实际上,大部分的Bean之间加载顺序并不会特意指定,创建的先后顺序自然没了保障(spring会执行默认的加载顺序,如字母排序)。

比如这个案例,如果先创建的是Parent,那么当我们做到属性装填这一步的时候,就会发现Parent的属性里,引用了一个未知的Bean —— Child。

ee4f565910ae0715bf3ea96f8a06d35c.png

这个时候Spring就会去搜寻并创建Child,此时Parent的创建就停滞了。那么这个创建未半而中道崩殂的Parent也需要有一个地方存起来啊。你或许会说,还是存在上面的一级缓存里面不行吗?

当然可以!但本着人以类聚物以群分的观念,对于这些创建了一半就中断的Bean,我们还是专门引入了三级缓存供其栖息。我们知道,此时Parent已经实例化了,但属性装填没完成,像个未孵化的蛋,而三级缓存就是个保温箱,是存放这些“蛋”的地方。实际上三级缓存里存的全是Bean工厂,可以通过Bean工厂的getEarlyBeanReference获取到这个未完成的Bean(蛋)。

循环引用(循环依赖)

如果不仅Parent里面引用了Child,Child里面也引用了Parent,那么显然,这就构成了循环引用。

0813d8f0573e86792752d1a5ff20bf36.png

我们假定Spring先加载了Parent,后发现需要注入Child,又去加载Child,过程中又发现需要注入Parent,那么又去加载Parent…… 那Spring会这么无限的加载下去吗?

答案我们都知道,自然是不会的。实际上,每开始加载一个Bean,Spring都会把Bean名称记录在一个叫SingletonCurrentlyInCreation的Set集合里。

顾名思义,这个集合里都是正在创建中的Bean,这个集合在其他的文档中很少提及,但显然他的作用十分巨大。因为第二次加载Parent时,Spring就发现Parent已经在这个集合中了,才意识到进入循环引用了。

473b53a3996634ec5ad54bf4c44db5b8.png

当发现进入循环引用后,自然Spring不会再傻乎乎的走再走一遍Parent的加载逻辑,而是从三级缓存中取出未完成的Bean,做一些处理后,然后将其放入二级缓存。

这一过程相当于从保温箱取出来未孵化的鸡蛋,孵化出小鸡后,放到专门的小鸡培养室中。而此时,只需要返回这只小鸡(Parent)就可以了,你或许会说,我要的是成品鸡,你给我小鸡有什么用,功能什么的能有保障吗?别急,我下面就为你解释这样的可行性。

循环引用中的代理

我们都知道Parent是创建了一半被放入缓存中的,此时它已经完成的步骤是生成实例正在卡着的步骤是属性装填和初始化,被从缓存中取出后,这两个步骤仍然是未完成的,但我们无需担心,因为此刻我们仅需完成引用,即我要引用Parent(成鸡),你现在给我返回半成品(小鸡)也没关系,因为我现在也不是要立刻就用你,只要你保证小鸡 成鸡在内存中的地址一样即可,即小鸡和成鸡是同一个对象。

你或许会问,小鸡长着长着,还能变了人不成?怎么可能小鸡和成鸡就不是同一个对象了呢?这就不得不谈代理模式了

97f66501cd39195deb5c86ce14f560a1.png

我们这里不去细谈代理流程,你只需要知道代理模式会产生一个新的对象,相当于一个霸道中介,原本你可以直接联系小鸡,现在小鸡的联系被中介切断了,你需要找小鸡就只能联系中介。所以,一旦成鸡后续需要代理,我们需要联系的就是成鸡的代理了,此时你给我小鸡的联系方式不顶用。

为避免这种情况,我们只能给小鸡生成中介。是的,原来中介是只给成鸡用的,但现在不得不提前到小鸡阶段了,生成中介后,返回给我们小鸡的-中介的-联系方式(即半成品Bean的-代理的-引用),事实上如果你看源码,对成品和半成品Bean生成代理用的是同一个方法wrapIfNecessary,因此生成代理的效果是一样的。当然你也许仍然有顾虑,对成品和半成品生成代理真的没差别吗?

的确,这里就不得不提Spring的代理的特殊点了,代理的基础就是大名鼎鼎的AOP 或者说 切面增强,然而Spring的增强仅针对方法。而半成品和成品,最大的差异是属性值,方法却是一样的,因此增强的效果肯定是一样的。如果哪天Spring的代理生成时会用到当前属性值,那不同阶段的代理功能才会有差异。

5三级缓存的解读

关于三级缓存,市面上有太多的解读文章,也是面试时经常问到的点,我们不妨解读一下三级缓存。

0eae7bcecca59c1230a559e34f9086be.png

我们平常说的三级缓存,大多数人会想到CPU的三级缓存,硬件上之所以缓存分级,是对于成本与性能的考量,一级缓存最快,所以CPU优先从一级缓存取东西,但同样一级缓存最贵,存不了太多数据,所以需要二级缓存。

而这里,三级缓存并没有性能上的区别,所以划分三级缓存并非必须。实际上一个Bean,在同一时间只会出现在某一级缓存中,因此我们可以直接产出一个暴论:Spring可以不用所谓三级缓存,甚至说只需要一个集合就能存下全部

但为什么这里要这么做,因为这是逻辑分层而非必要分层,三级缓存存着不同状态的Bean罢了:一级缓存存成品鸡,二级缓存存小鸡,三级缓存存鸡蛋 一级比一级原始,你要非把成品鸡、小鸡、鸡蛋搁一个房子里也不是不行,所以这种分层是基于逻辑清晰而非逻辑必需。

这里还有个误区,很多人说是因为代理的存在,导致需要三级缓存,如果没有代理,两级就够了。实际上三级缓存并不是因为代理导致的,不管有没有代理,都是三级缓存。

就像我说的一级缓存存成品鸡,二级缓存存小鸡,三级缓存存鸡蛋 ,这里面并不区分代理,成品鸡或者成品鸡的代理都在一级缓存;小鸡或者小鸡的代理都在二级缓存。

实际上我们看代码,只要发生了循环引用,都会导致Bean从三级缓存取出,并放入二级缓存。这个过程中执行wrapIfNecessary,不管生不生成代理都是一样的,只不过如果需要代理,放入二级缓存的是小鸡的代理;如果不需要代理,放入二级缓存的就是小鸡本鸡,因此我们可以说 不管有没有代理,三级缓存的模式都没有变化。

6创建Bean的极详细流程

多说无益,我根据Spring4的源码整理了一份详细的生成流程,这图说是全网最细也不为过,欢迎大家补充和指正

675bb618fb82c200313892a2b483530c.png

欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

d78c56eb35b47ac9c44c06476d04d657.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

93be8cf14ac405957270e0918d440aff.png

7334d3a465055c6fccbbbe402eb85920.pngd03b6679a36aa66c5a976ff6d456bc31.pngf373def6710b42c6060696c4953ee4ba.pngac70bbe576a12e68560af6e171fc9383.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
2026年AI视频生成大模型全景指南:国内外主流工具深度对比与选型建议 AI视频生成技术在2025年至2026年间取得了突破性进展,从"能用"进化到"好用",商业化应用加速落地。中美双轨竞争格局基本成型,国内模型在技术追赶和本土化体验方面展现出强劲竞争力。对于用户而言,选择合适的AI视频生成工具需要综合考虑技术性能、使用门槛、成本预算和具体需求。零基础新手推荐海艺AI、通义万相等低门槛工具;进阶创作者可根据需求选择可灵AI、即梦AI、海艺AI等;专业开发者和企业用户可考虑智谱清影的开源能力或可灵AI的商业化服务。 阅读详情

相关推荐

iOS反编译-hook微信之艾特所有人

all。

2501_90243249的博客 759

Spring的Bean初始化过程和生命周期

Spring中Bean生命周期真的不难

初心不忘、始终方得 3527

双三相电机控制避坑指南:为什么你的SVPWM谐波大?四矢量调制实战解析

本文深入解析双三相电机控制中SVPWM谐波大的问题,并提供四矢量调制实战方案。通过分析谐波来源、四矢量调制原理及工程实现步骤,显著降低电流THD至3-5%,提升系统效率2.3个百分点。特别适合需要优化电机控制的工程师参考。

weixin_30645617的博客 397

Spring之Bean的生命周期

spring最重要的功能就是帮助我们创建对象,也就是IOC。启动spring就是为创建Bean对象做准备,所以我们必须先明白Spring到底是怎么去创建Bean的,也就是要先弄明白Bean的生命周期。

qq_14946371的博客 361

UCD9081EVM电源时序管理:硬件配置与GUI操作全解析

电源时序管理是复杂电子系统设计的核心环节,它通过精确控制多路电源的上电/下电顺序,确保核心芯片免受浪涌电流或电压倒灌的损害。其原理基于状态机逻辑与电压监控,技术价值在于将硬连线时序转化为可编程配置,极大提升了系统可靠性与设计灵活性。在服务器、通信设备、工控系统等高可靠性应用场景中,时序控制器是实现稳定启动与故障保护的关键。本文以德州仪器UCD9081评估模块为例,深入剖析其硬件跳线配置与图形用户界面操作,涵盖I2C地址设置、电压监控分压计算、时序条件与故障响应策略等工程实践要点,帮助工程师快速掌握这一电源时

weixin_42696271的博客 302

Lattice CrosslinkNx LIFCL-40实战解析:MIPI D-PHY硬核IP配置与CSI-2数据解析全流程

本文详细解析了Lattice CrosslinkNx LIFCL-40 FPGA中MIPI D-PHY硬核IP的配置与CSI-2数据解析全流程。通过实战案例,介绍了硬件环境搭建、寄存器配置、数据包结构解析及视频流重构技巧,帮助开发者快速掌握高速图像采集系统的设计与优化方法。

weixin_29159613的博客 200

【Java面试小短文】Spring Bean生命周期的执行流程

生命周期全过程大致分为五个阶段:创建前准备阶段、创建实例阶段、 依赖注入阶段、 容器缓存阶段和销毁实例阶段。 快来看看详细解释!

卓越无关环境,保持空杯心态——靡不有初,鲜克有终 2910

从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型2

上一期分析了MATLAB的黄金算法原理,这一期进行Simulink模块分析。

WZT725的博客 2086

Spring--Bean的创建过程/获取流程--SpringBoot

本文介绍Spring中Bean是如何创建出来的。 Spring的核心模块是IOC和AOP,而IOC中创建Bean又是十分重要的一环。在Spring的启动过程中,会在refresh()方法中调用finishBeanFactoryInitialization()。在finishBeanFactoryInitialization中完成了非懒加载的单...

IT利刃出鞘的博客 2256

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

XiaoqiangClub的博客 7169

化工管道设计软件:CAESAR II二次开发_(6).API接口与函数库

自定义函数库是开发者根据特定需求编写的函数集合。这些函数可以扩展CAESAR II的功能,实现更复杂的管道设计任务。自定义函数库通常需要开发者具备一定的编程基础,能够理解和编写与CAESAR II接口兼容的代码。定义函数:在Python或其他编程语言中定义所需的函数。注册函数:将自定义函数注册到CAESAR II的函数库中。调用函数:在CAESAR II中调用自定义函数,实现特定功能。假设我们需要创建一个自定义函数库,用于批量修改管道节点的坐标。定义函数:在Python中定义一个函数,用于批量修改节点坐标。

kkchenjj的博客 1729

Spring源码分析之Bean的创建过程详解

前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 本文内容: 在IOC中,是如何通过beanDefition创建出一个bean的? 各BeanPostProcessor在这过程中扮演的角色,调用时机? 话不多说,直接正题走起,上图! 下面是bean创建过程的大致流程图,本文将以图中顺序进行逐步源码分析,小伙伴亦可与图中流程边对照边品食 原矢量图地址:https://

雕爷的架构之路 960

数字孪生教程大全之 我们如何构建数字孪生?数字孪生的五个级别都是什么

文章摘要 什么是数字孪生? 我们如何构建数字孪生? 开发智能数字孪生系统的框架 什么是数字孪生? 数字孪生是一个不言自明的术语,用于识别物理系统的数字化版本。数字孪生的最早参考来自大卫·格伦特(David Gelernter )的小说作品。在他 1995 年的书中,Gelernter 博士为读者提供了未来有趣的可能性——万维网。前网络书籍谈到了计算机系统上的镜像数字世界。有些人可能会争辩说,我们的 Meta-verse 是新的数字世界——现实世界的数字孪生。但是,还有其他可能性,时间可能会讲述一个更好的

iCloudEnd的博客 3634

Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析

在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近吧整个流程化成了一个流程图。待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程。注意因为代码比较多,这里的流程图只画出了大概的流程,具体的可以深入代码 1. 获取Bean 第一阶段获取Bean这里的流程图的入口在AbstractBeanFactory类的doGetBean方法,这里可以配合前面的getB...

勇往直前的专栏 490

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深入浅出:Spring Bean 的初始化流程详解

在 Spring 框架中,Bean 是构成应用程序的基石。理解 Bean 的初始化流程,是掌握 Spring 核心机制的关键。本文将通过 「奶茶店制作奶茶」 的比喻,逐步拆解 Spring Bean 的完整生命周期,涵盖从定义到销毁的全过程。

yiridancan的博客 1504

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

实战:详解Spring创建bean的流程(图解+示例+源码)

我们来看下 Spring Framework 的官方文档:简而言之,bean 是由 Spring IoC 容器实例化、组装和管理的对象。对于普通的 Java 对象,当 new 的时候创建对象,然后该对象就能够使用了。一旦该对象不再被使用,则由 Java 自动进行垃圾回收。而 Spring 中的对象是 bean,bean 和普通的 Java 对象没啥大的区别,只不过 Spring 不再自己去 new 对象了,而是由 IoC 容器去帮助我们实例化对象并且管理它,我们需要哪个对象,去问 IoC 容器要即可。

为无为,事无事,味无味。 6445

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring 初始化bean过程图解

一、Spring 容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配号Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。 二、内部工作机制 该图描述了Spring容器从加载配置文件到创建出一个完整Bean的作业流程: 1、ResourceLoader从存储介质中...

fyedu的专栏 1409

【Spring源代码阅读之十二】spring的Bean创建过程和图解spring是如何解决循环依赖的

spring的Bean创建过程、spring是如何解决循环依赖的创建过程图循环依赖集合循环依赖代码话解图解 创建过程图 spring在容器的启动创建阶段,对单例Bean等会默认进行实例的创建,其实就是获取需要创建实例的BeanName,调用getBean方法对其进行创建,只不过就是没有接收返回的参数而已,只是为了Bean的实例化,因为在Bean实例化过程的最后将Bean实例已经放进了集合中了,当再...

weixin_42997554的博客 908

图解Spring中bean的生命周期

Bean的生命周期 正确理解Spring bean的生命周期非常重要,因为你或许要利用Spring提供的扩展点来完成特定需求。如下图展示了bean 装载到Spring应用上下文中的一个典型的生命周期过程。 接下来我们对该图中的内容进行详细解释 Spring对bean进行实例化; Spring将值和bean的引用注入到bean对应的属性中; 如果bean实现了BeanNameAware接口,Sp...

Java新生代 2275

spring循环依赖原理图解+bean的生命周期图解

Spring是如何处理循环依赖的,又是怎么做到,互相注入对方的proxy bean而不是raw bean的?现在就分析一下循环依赖其实耐下功夫读源码,也没有那么难。下次分享为什么循环依赖的其中一个类添加@Async有可能会导致注入失败而抛异常–这篇博客。

liangsheng_g的专栏 565

图解Spring源码4-Spring Bean的作用域

/ 作用域// 根据名称获取bean,如果bean不存在那么调用ObjectFactory(函数式接口)的getObject进行生成// 删除bean@Nullable// 注册销毁的回调方法// 省略其他不关键的方法> objectFactory):根据名称获取bean,如果bean不存在那么调用ObjectFactory(函数式接口)的getObject进行生成Object remove(String name):删除bean。

dasdjsdsa的博客 1123

Spring Ioc 容器Bean加载图解

4.Bean加载 public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory { @Override public Object getBean(String name) throws BeansException { asse...

Piemon&Anokata的博客 473

一张图让你读懂spring bean的生成过程

​​​​ 目的: 不拘泥与具体某个方法,对spring bean的生成能有一个整体的把握。 图片整体预览 正文 spring bean的生成主要分为两个阶段,第一个是bean Definition的生成 ,第二个是bean的生成。也就是本文的主要内容。 对于spring实例初始一个bean,我们主要分析一下几点 子类beanDefinition合并父类bean Definition的一些数据;...

小样 1727
上一篇: SpringCloud 微服务迁移到 Kubernetes 容器化完整流程
下一篇: MySQL到底是 join 性能好,还是in一下更快呢?
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值