简单理解Spring getBean流程

Java_web开发_SSH spring中取得Bean实例的方法 1.如果applicationContext文件是在src的根目录下:  ApplicationContext apt= new FileSystemXmlApplicationContext("src/applicationContext.xml");apt.getBean("ID");可以取得2.如果文件是在WebRoot/WEB-INF下可以用ApplicationContext applicationContext= new FileSystemXmlApplicationContext("../a 阅读详情

本文直接讲述流程,不贴代码,全是干货,面试必看,口口相传。

熟悉Spring启动流程的同学应该清楚,refresh()是最为重要的关键方法,其调用的finishBeanFactoryInitialization(beanFactory)方法则完成了所有非懒加载的单例Bean的实例化和初始化,属性的填充以及解决了循环依赖等问题。

实例化时指将Bean创建出来,初始化是指为bean的属性赋值。

先说一下Bean的创建和管理的一个基本过程, 我们想要获取一个Bean,首先要从我们的bean工厂中获取(注意说的是ObjectFactory),bean工厂则是要去bean仓库中去取,如果仓库中有就直接返回,没有则会创建然后再返回。

SingletonBeanRegistry的实现DefaultSingletonBeanRegistry的属性中便保存着我们的单例对象(三级缓存便在其中)。

代码中创建Bean的过程分为了三步:实例化、填充属性、初始化,分别对应方法createBeanInstance、populateBean和 initializeBean;

之所以和我们前面提过的初始化即是属性赋值有所不同,是因为spring在填充完属性后又执行了一些这个Bean相关的初始化方法。

明白了大致过程后,接下来直接过获取Bean流程:

  • getBean方法在Bean的创建和获取过程中都会用到;另外,我们要注意spring方法起名的特点,有getBean方法,又会有doGetBean方法。同理,后面调用createBean方法,也会调用到doCreateBean方法。
  • getBean后会调用doGetBean方法,第一次调用getSingleton方法先从单例池(一级缓存)中获取;然后当前Bean如果有配置了 depend-on 标签的话,会先去初始化配置的Bean;
  • 紧接着判断是否单例,会第二次调用getSingleton方法,和第一次方法传参不同,多了一个ObjectFactory参数,ObjectFactory是一个函数式接口,有一个抽象方法getObject,而getSingleton的传参是以lamda表达式(即内部实现类)来写的,也就是说,内部类中return的creatBean方法的结果就是ObjectFactory的getObject()返回的值,也就是我们的bean工厂,生成后会保存在一个名叫singleObjects的Map(一级缓存)当中。
  • creatBean调用doCreatBean,接着调用createBeanInstance实例化Bean,主要是为了推断出实例化Bean所需要的构造器,通过反射创建对象;
  • 然后会缓存一些注解元数据信息以及addSingletonFactory方法解决循环依赖问题,此处代码不做重点讲述,面试会直接问循环依赖问题的。
  • 接着执行populateBean方法填充属性,执行两个后置处理器完成自动装配的功能。
  • 接下来会执行initializeBean()方法,该方法中主要会判断执行Aware接口的方法,以及后置处理器的初始化前和初始化后方法等。

好了,虽然以上内容讲解不够详细,但应付面试绰绰有余,想更加详细的理解还是要自己搭建spring本地部署运行起来,一步步地debug,自己加注释,才容易融会贯通。

五种查看Spring容器中bean的方法 Spring应用程序中,了解和查看容器中的Bean对于调试和问题排查至关重要。本文介绍了五种常用的查看Spring容器中Bean的方法,包括使用​​、​getBean()​、​​、Spring Boot Actuator端点和调试工具。通过灵活运用这些方法,我们可以深入了解应用程序的内部结构,观察Bean的属性和状态,并有效地调试和解决潜在问题。掌握这些查看Bean的技巧,将帮助开发人员更好地利用和调试Spring容器,提高应用程序的可靠性和稳定性。 阅读详情

相关推荐

5、高级综合技术:从调度到优化的全面解析

本文深入解析了高级综合技术,涵盖从控制/数据流图构建、调度算法、分配绑定策略到编译器优化的全流程。通过案例分析和对比,探讨了不同优化策略对性能和资源利用的影响,并总结了关键要点及未来发展趋势,为高效利用FPGA实现数字设计提供了全面指导。

night的博客 91

SpringContextHolder 获取bean

使用注解形式进行加载,实现ApplicationContextAware接口并复写setApplicationContext方法。 将上下文环境对象以静态变量保存下来。则可以在工具类中使用SpringContextHolder.getBean()的方法获取实体或者service进行操作数据 使用@Service注解形式进行实体注入 package com.hema.common.utils...

qq_40010745的博客 1428

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

Robot_PLC_HMI_Automation 3093

使用SpringContextHolder获取bean实例

       昨天在开发的时候遇到一个小问题,本来博主在写Excel的导出,但是Excel所有数据都是动态的,需要根据用户id将用户名显示出来,此时就需要调用用户服务。由于ExcelExportUtil这个类是我自己封装的,用于导出的工具类。里面所有方法都是静态的。这时,如果使用@Autowired注解装配bean,是无法在静态...

清风一阵吹我心 3770

关于 SpringgetBean 的全流程源码解析

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 你提出问题,就要给出解决方案! 最近有粉丝小伙伴反馈,与自己的上级沟通总是遇到障碍,感觉不被理解。大部分时候他提出来的事情都可能会被领导说:“我没get到你的点”、“你想做的这个项目没有业务价值”、“你提出问题,就要给出解决方案”,等等诸如此类的回答。 鉴于具体情况要具体分析,可能我们并不一定能判断出是谁的问题,导致在每次的交谈中出现的分歧。可能是leader有leader的苦衷和

bugstack虫洞栈 3016

Spring getBean流程

Bean的生命周期(创建Bean的流程) 简单来说,Bean的生命周期只有四个阶段:实例化 Instantiation --> 属性赋值 Populate --> 初始化 Initialization --> 销毁 Destruction。 getBean方法是spring ioc的核心,阅读getBean方法的源码也是理解spring容器工作原理所必须要做的事情! 我们先来看一下getBean方法,getBean的具体实现逻辑在AbstractBeanFactory类里面的doGetB

香槟的博客 525

Spring源码之BeanFactory.getBean()

本文是针对Srping的BeanFactory.getBean来进行源码解析,如果您是第一次看请先看一下XMLBeanFactory解析:https://blog.csdn.net/qq_30257149/article/details/87972291,可以更好的理解Spring的注册原理,本篇博客是跟源码一步步看spring怎么实现getBean源码,Spring版本为5.X,源码已经在每一行...

lantao 1万+

Spring BeanFactory.getBean()流程

Spring BeanFactory.getBean() 开始 获取Class对象 1. step1: 找到合适的classloader(一般这里是以Thread.currentThread().getContextClassLoader()获得,正如《深入理解JVM虚拟机》所说这其实是一种破坏双亲加载的机制)     step2: 加载bean对应的class文件为Class对象 实

u011385186的专栏 3877

Spring: GetBean源码解析

对于刚接触看 Spring 源码的伙伴来说,可能很疑惑于怎么就获取一个 Bean 就这么多流程呢?可能有 Bean 可能有别名、可能有依赖、也可能是被 BeanFactory 包装过,所以会有 transformedBeanName 来处理这些差异化行为。有没有循环依赖、有没有父工厂、是单例还是原型、是懒加载还是预加载、在不在缓冲区,所以就有各种组合判断来做不同的流程。提早暴漏对象、三级缓存、后置标记清楚,所有的优化处理都是为了让整个 Bean 的获取更加高效。...

GIS摆渡人 878

Spring源码】getBean源码实战总结

本文总结了Spring框架中getBean()方法的源码实现与核心机制。通过6篇系列文章的分析,揭示了Bean获取的完整流程,包括名称转换、三级缓存、循环依赖处理、FactoryBean机制、Bean定义合并和Aware回调等关键环节。文章详细阐述了三级缓存如何解决单例Bean的循环依赖问题,解释了FactoryBean的特殊处理方式,并分析了MergedBeanDefinition的合并机制。这些机制共同构成了Spring IoC容器的核心功能,体现了Spring在功能性和性能之间的精妙平衡。通过理解这些

weixin_44250106的博客 808

Spring容器初始化、bean解析、getbean流程

SpringBean 创建 Context介绍: Context类图如下: 主要类功能 ApplicationContext:Context的核心接口,主要功能都是继承其他接口而来,ListableBeanFactory(获取和访问bean功能),MessageSource(解析消息,支持国际化),ApplicationEventPublisher(发布event到注册的lisn...

yangkewei616的专栏 3284

面试官:SpringgetBean 中,transformedBeanName 的作用是什么?

BeantransformedBeanName 的作用:规范化 Bean 名称,处理别名和工厂前缀。核心流程getBean→→ 查缓存 → 创建 Bean。

Like0703的博客 935

Spring 之 BeanFactory 核心:getBean 方法的流程——前言

Spring 之 BeanFactory 核心:getBean 方法的流程——前言 参考地址: 《Spring核心之BeanFactory 一张图看懂getBean全过程.》 前言 笔者最近在工作空闲时间研究 Spring 的生命周期部分,好奇之下也总结了《Spring 中 BeanFactory 的生命周期与源码解析(附例程)》。然而对于 Spring 框架如何获取一个 Bean...

琦小虾的代码世界 3802

Spring容器Bean的创建流程

本文将从源码角度分析Spring容器中Bean的创建流程,重点关注从getBean()方法开始的完整调用链路,通过源码分析Spring IoC容器的核心工作机制。在学习SpringIoC容器中Bean是如何创建的过程中,我翻阅的无数次源码,也借鉴了很多大佬的文章,一次一次的打断点需要很大的耐心,虽然现在的学习没有得到正反馈,但是在将来的一天当你把源码烂熟于心是,不管是写博客总结还是在面试中被问到,可以胸有成竹的回答出来。希望大家可以更好的理解Bean的创建流程

动动发财的小手点点赞 972

Spring IOC:getBean调用链

参考资料: 《Spring IoC源码学习:getBean 详解》 前文: 《Spring IOC:finishBeanFactoryInitialization调用链》 写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。 一、getBean 1、getBean 跳转至doGetBean方法(观察Srping的命名习惯,方法名使用do开头的方法是最终进行实际操作的方法)。 // AbstractBeanFactory.java...

CRUD工程师 504

spring初始化bean全流程 getBean

小样 358

getBean完整流程

getBean完整流程

鱼乐1024 173

深入解析Spring核心:getBean方法的工作原理与实现

深入解析Spring核心:getBean方法的工作原理与实现 【免费下载链接】spring-reading 涵盖了 Spring 框架的核心概念和关键功能,包括控制反转(IOC)容器的使用,面向切面编程(AOP)的原理与实践,事务管理的方式与实现,Spring MVC 的流程与控制器工作机制,以及 Spring 中数据访...

gitblog_00566的博客 500

基于51单片机智能台灯节能灯热释人体自动感应照明灯.zip

本系统由STC89C52单片机、光照检测、A/D采样ADC0832、高亮LED灯、按键、液晶LCD1602显示、人体热释红外模块及电源组成。功能描述:1、系统有自动模式和手动模式,按下切换开关,在手动模式,可以通过手动开灯关灯。2、再次按下切换开关,系统进入自动模式,如果检测到有人,且光敏电阻检测到的光线强度低于手动设定的光照阈值,则灯亮,否则,不亮。光照阈值可以手动调节。3、液晶第一行显示切换模式,第二行显示环境光照强度和设置的阈值。4、人体检测只有在自动模式下起作用,人体检测有状态指示灯指示,检测到人指示灯亮否则不亮。资料包含:程序源码电路图任务书答辩技巧开题报告参考论文使用到的芯片资料器件清单等等

上一篇: FactoryBean和BeanFactory
下一篇: 最易懂Spring循环依赖
chenxuyuana
博客等级 码龄4年 285粉丝 257原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值