[Spring]Spring Bean的初始化 ---- getBean方法

按照autoware.universe官方从零搭建自己的自动导航小车(三)(续) 本文介绍了在Autoware框架下完善自定义传感器套件描述包的详细过程。主要内容包括:1)创建传感器描述包tinyplc_sensor_kit_description,包含YAML标定文件和URDF模型;2)配置传感器与车辆基座的相对位姿,实现sensor_kit.xacro和sensors.xacro宏文件;3)更新sensor_kit.launch.xml文件以集成激光雷达和GNSS/IMU驱动。通过xacro验证URDF模型正确性后,下一步计划接入Helios16激光雷达数据并在Rviz2中验证点云显 阅读详情

Spring 无论实在spring 容器在初始化阶段 还是 懒加载的bean 都是通过BeanFactory的getBean方法来实例化bean的。

getBean方法提供了多种方式来获取bean 可以通过bean的名字,bean的类型等。

但是他们最后都是调用的doGetBean(...)方法

	protected <T> T doGetBean(
			final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
			throws BeansException {

		final String beanName = transformedBeanName(name);
		Object bean;

		// Eagerly check singleton cache for manually registered singletons.
		Object sharedInstance = getSingleton(beanName);
		if (sharedInstance != null && args == null) {
			if (logger.isDebugEnabled()) {
				if (isSingletonCurrentlyInCreation(beanName)) {
					logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
							"' that is not fully initialized yet - a consequence of a circular reference");
				}
				else {
					logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
				}
			}
			bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		}

		else {
			// Fail if we're already creating this bean instance:
			// We're assumably within a circular reference.
			if (isPrototypeCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(beanName);
			}
			// Check if bean definition exists in this factory.
			BeanFactory parentBeanFactory = getParentBeanFactory();
			if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
				// Not found -> check parent.
				String nameToLookup = originalBeanName(name);
				if (args != null) {
					// Delegation to parent with explicit args.
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else {
					// No args -> delegate to standard getBean method.
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
			}

			if (!typeCheckOnly) {
				markBeanAsCreated(beanName);
			}

			try {
				final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
				checkMergedBeanDefinition(mbd, beanName, args);

				// Guarantee initialization of beans that the current bean depends on.
				String[] dependsOn = mbd.getDependsOn();
				if (dependsOn != null) {
					for (String dependsOnBean : dependsOn) {
						if (isDependent(beanName, dependsOnBean)) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"Circular depends-on relationship between '" + beanName + "' and '" + dependsOnBean + "'");
						}
						registerDependentBean(dependsOnBean, beanName);
						getBean(dependsOnBean);
					}
				}

				// Create bean instance.
				if (mbd.isSingleton()) {
					sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
						@Override
						public Object getObject() throws BeansException {
							try {
								return createBean(beanName, mbd, args);
							}
							catch (BeansException ex) {
								// Explicitly remove instance from singleton cache: It might have been put there
								// eagerly by the creation process, to allow for circular reference resolution.
								// Also remove any beans that received a temporary reference to the bean.
								destroySingleton(beanName);
								throw ex;
							}
						}
					});
					bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}

				else if (mbd.isPrototype()) {
					// It's a prototype -> create a new instance.
					Object prototypeInstance = null;
					try {
						beforePrototypeCreation(beanName);
						prototypeInstance = createBean(beanName, mbd, args);
					}
					finally {
						afterPrototypeCreation(beanName);
					}
					bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
				}

				else {
					String scopeName = mbd.getScope();
					final Scope scope = this.scopes.get(scopeName);
					if (scope == null) {
						throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
					}
					try {
						Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
							@Override
							public Object getObject() throws BeansException {
								beforePrototypeCreation(beanName);
								try {
									return createBean(beanName, mbd, args);
								}
								finally {
									afterPrototypeCreation(beanName);
								}
							}
						});
						bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
					}
					catch (IllegalStateException ex) {
						throw new BeanCreationException(beanName,
								"Scope '" + scopeName + "' is not active for the current thread; consider " +
								"defining a scoped proxy for this bean if you intend to refer to it from a singleton",
								ex);
					}
				}
			}
			catch (BeansException ex) {
				cleanupAfterBeanCreationFailure(beanName);
				throw ex;
			}
		}

		// Check if required type matches the type of the actual bean instance.
		if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) {
			try {
				return getTypeConverter().convertIfNecessary(bean, requiredType);
			}
			catch (TypeMismatchException ex) {
				if (logger.isDebugEnabled()) {
					logger.debug("Failed to convert bean '" + name + "' to required type [" +
							ClassUtils.getQualifiedName(requiredType) + "]", ex);
				}
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
		}
		return (T) bean;
	}
好吧  这一段 实在是太长了。
那么我们整理一下大概思路:

1. 检查缓存中是否存在该单例,存在该单例并且不带任何参数,那么得到共享实例

2. 不存在实例 或者带参数, 那么先查询是否存在该bean的定义。

     2.1 如果在当前beanFactory里找不到定义,那么就继续向上搜索parentBeanFactory,委托给parentBeanFactory来实例化。

     2.2 存在定义 or 不存在parentBeanFactory,尝试得到该beanName 的定义,没有则抛异常

     2.3 得到以来RootBeanDefinition mbd,首先检查依赖,该bean是否依赖于其他的bean,然后根据依赖先初始化依赖bean

     2.4 该bean定义是否为单例,是单例,那么使用单例工厂加载该单例。然后从共享实例中获得。

     2.5 如果该bean定义为prototype,那么创建该prototype

     2.5 如果既不是单例 也不是 prototype,根据scope来定制bean

     2.6 这个时候进行最后一步,对bean进行类型检查,如果需要转型则进行转型。


所以说这里大概是 主要两个过程,一个是检查缓存是否存在该bean,一个是对bean的第一次初始化。

windows在使用ping 127.0.0.1时出现一般故障的解决方案 本文主要介绍了windows在使用ping 127.0.0.1时出现一般故障的解决方案,希望能对使用windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 阅读详情

相关推荐

rag综述——RAG技术发展流程、最新技术挑战与系统级优化

RAG技术发展综述:本文系统梳理了检索增强生成(RAG)技术的演进历程,从2017年开放域问答中的早期探索,到2020年正式提出RAG架构并与大模型深度融合,再到2025年向系统化、可信化和智能体化发展。当前RAG面临检索可靠性、系统效率和生成可信度三大核心挑战,解决方案包括领域自适应训练、强化语义编码、迭代检索策略等优化方向。未来RAG将向GraphRAG、SafeRAG等方向发展,从单纯性能优化转向构建可控、可审计的语言系统框架,成为高可靠大模型应用的基础设施。

lovehu6686的博客 1240

解析BeanFactory的核心方法——getBean

本系列源码都是基于spring-4.3.8版本之上,其他版本略有差异,但总体的核心思想相同。同时,为了使贴出的源代码尽可能的紧凑,可能会删去一些异常捕获、日志输出等代码。若文中存在纰漏错误,欢迎指正。 先看一下BeanFactory中定义的所有getBean方法 Object getBean(String name) throws BeansException; &lt...

gamezjl的博客 3056

【学习体会】Lighttools8.4.0:矩形阵列光源+条形光源的光学仿真分析

在solidworks中设计了条形光源的基本结构: 由32*6个矩形led组成矩形光源阵列,如下所示 另存为step文件后,导入lighttools中,这里要设置模型的光学属性为:吸收体(机械) 因为我们设计的光源模型是一个整体,我们不能单个面的设置光源,比如说, 这样做的话并不会是这个面设置为光源,而是会把做一个模型都变成一个光源,如下 这显然不是我们想要的 那么,我们就在led位置上放置一个矩形面光源, 这样我们就放置好了一个面光源, 但是问题是,还有191...

LeonJin的博客 1万+

HuiFer 带你读懂 BeanFactory getBean 方法

Spring BeanFactory Author: HuiFer 源码阅读仓库: SourceHot-spring BeanFactory 概述 org.springframework.beans.factory.BeanFactory 类图 方法列表 贴出部分代码. 仅表示方法作用 public interface BeanFactory { // 从容器中根据beanname获取 Object getBean(String name) throws BeansException

huifer 2053

欧姆龙 CJ1W-SCU模块使用通配符+结束码实现非固定长度数据的接收

实验设备:CJ2M-CPU33、CJ1W-SCU21、XW2Z-200T 实验目的:了解 CJ1W-SCU 通配符使用 1.硬件接线: CJ1W-SCU21单元号拨码置于8,使用串口1(232口)。 2.软件设置: ① 新建工程,选择PLC型号CJ2M-CPU33,切换到编程模式,如下图: 、 ② 创建I/O并进行相关配置,如下图: ③ 设置为用户设置,协议宏模式,8位数据位,2位停止位,偶校验9600波特率,如下图: 、 ④ 打开CX-Protocal软件,新建工程: .

weixin_42118352的博客 1984

sentaurus学习笔记(HFET_pGate_GaN仿真)(九)

`(sdedr:define-constant-profile-placement "Ohmic.s" "Ohmic" "Pl.ohmic.s" 0.002)`这一行将`"Ohmic"`掺杂剖面放置在`"Pl.ohmic.s"`参考评估窗口中,同样`0.002`可能表示掺杂剖面在窗口中的偏移量或其他参数。欧姆接触是半导体器件中的一种低阻抗电气接触,通常需要高掺杂来减少接触电阻并提高器件性能。通过这些步骤,SDE能够为器件的源极和漏极区域设置高掺杂的欧姆接触,这对于确保器件的高性能和低接触电阻至关重要。

qq_52640792的博客 1382

Spring IOC(五)BeanFactory.getBean 方法分析

Spring 容器帮程序管理Bean,而实际上最终是由BeanFactory 管理的,本文就具体分析getBean方法。 重载方法 Spring 提供以下方法获取bean实例,当然大同小异: getBean 以 传入 classType为例,当调用 getBean:204, AbstractBeanFactory,进入 AbstractBeanFactory 的 getBean 方法: @Ov...

anLA_的专栏 1665

Teams会议翻译对比测试:Copilot同传 vs 人工翻译,结果出乎意料

本文通过对比测试Microsoft 365 Copilot的实时翻译与专业人工翻译在Teams会议中的表现,揭示了AI同传技术在准确率、响应速度和多语言切换方面的优势与局限。实验数据显示,Copilot在常规商务场景下接近人工翻译水平,且成本效益显著,但在专业术语和文化特定表达上仍需人工辅助。

weixin_29054195的博客 223

【细读Spring Boot源码】Spring如何获取一个Bean?BeanFactory的getBean方法

finishBeanFactoryInitialization(beanFactory); 这里包含了前置处理器和后置处理器

文文的博客 2317

RK3588 MIPI屏幕调试避坑指南:双通道8Lane下DSC压缩屏的花屏、分层问题排查实录

本文详细解析了RK3588平台在双通道8Lane MIPI接口下调试DSC压缩屏时遇到的花屏、分层问题。通过硬件信号完整性检查、软件配置验证及帧数据分析,提供了一套系统化的排查方法,并深入探讨了初始化序列优化和双通道同步机制,帮助工程师高效解决高分辨率屏幕显示异常问题。

weixin_27015733的博客 280

用Java和MQTT搞定大疆无人机自动巡检:一个真实机场项目的踩坑与优化记录

本文详细介绍了如何利用Java和MQTT协议实现大疆无人机在机场自动巡检系统的开发与优化。通过实战案例分享系统架构设计、通信协议选型、断线重连机制及数据通道优化等关键环节,帮助开发者解决GPS信号漂移、MQTT消息风暴等典型问题,提升系统性能和可靠性。

weixin_30275415的博客 495

【spring源码 4.3.7】Spring IoC源码学习:BeanFactory.getBean() 详解

文章目录前言1. getBean()2. doGetBean()2.1 AbstractAutowireCapableBeanFactory.createBean()2.1.1 doCreateBean()2.1.1.1 createBeanInstance()2.1.1.2 populateBean()2.1.1.3 initializeBean()2.1.1.3.1 Spring Bean的生命周期 前言 《Spring IoC源码学习:finishBeanFactoryInitialization()

m0_45406092的博客 876

第10章《VTK自定义部件Widget》

是用于交互式操作 3D 场景的组件,例如移动对象、调整尺寸、创建标注等。VTK 提供了一些内置的 Widget,如。,用户可以点击鼠标,在 3D 场景中放置一个点。负责绘制一个点,并控制其颜色、大小等。,可用于 3D 标注、对象拾取等应用!等,但在某些应用中,我们需要。这样,我们就创建了一个。

yumeiguo的博客 523

Spring框架IOC容器初始化核心源码解析之四:Bean初始化(getBean)

单例bean的初始化入口 先回顾下refresh方法: public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRef...

老周(重庆)的博客 514

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring GetBean流程

 第一节讲解Spring启动的时候说到,Spring内部先解析了所有的配置,加载所有的Bean定义后,再根据需要对Bean进行实例化和初始化。除开Spring自己主动新建的对象,第一次根据Bean定义加载对象的动作出现在AbstractApplicationContext的invokeBeanFactoryPostProcessors方法,该方法会在Spring容器中找出实现了BeanF...

cxyAtuo的博客 949

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

spring创建bean过程

一.前言 spring作为JAVAEE最核心的框架,是每一个java开发者所必须掌握的,非常重要,本篇从一个简单例子入手,由浅入深的分析spring创建bean的全过程,目标在于彻底搞懂spring原理,方便以后整合其他框架 二.测试代码 /** * * * @author <a href="mailto:2256222053@qq.com">zc</a> * @Date 2022/4/3 0003 14:45 */ @Lazy public class Cr

qq_41595149的博客 2185

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

spring学习-分步getBean方法(1)

spring学习-分步getBean方法

u013485533的专栏 1451

getbean方法找不到bean_品Spring:动手才知道,三十步才能完成一个bean实例的创建...

在容器启动快完成时,会把所有的单例bean进行实例化,也可以叫做预先实例化。这样做的好处之一是,可以及早地发现问题,及早的抛出异常,及早地解决掉。本文就来看下整个的实例化过程。其实还是比较繁琐的。一、从容器中找出所有的bean定义名称因为不知道谁是单例bean,所以只能先全部找出来。如下图01:二、循环遍历所有的bean名称,检查是否符合条件首先要合并bean定义,因为bean定义可以有父子关系,...

weixin_39681161的博客 1328

getBean()源码分析

一、getBean() //AbstractBeanFactory.java getBean()→ protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnl...

莫问收获,但问耕耘 400

Spring(八)核心容器 - Bean 创建过程

文章目录1、整体流程2、核心流程2.1 解析 FactoryBean2.2 从 createBean 开始2.2.1 创建 Bean 实例2.2.2 初始化 Bean 实例 - 属性注入2.2.3 初始化 Bean 实例 - 执行初始化方法(回调钩子接口) Spring 版本 5.0.7.RELEASE 获取 Bean 的方法是 getBean,其来自 BeanFactory 继承的 Abst...

qq_36277052的博客 431

【小家Spring】AbstractBeanFactory#getBean()、doGetBean完成Bean的初始化、实例化,以及BeanPostProcessor后置处理器源码级详细分析

前言 这边博文,主要讲解我们IOC容器的主菜:Bean的实例化。 通过之前跟踪Spring IOC刷新的源码,我们所有的剩余的单例Bean都是通过此处来进行初始化的。最重要的一个方法就为:DefaultListableBeanFactory#preInstantiateSingletons 然后内部核心方法为:getBean --&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; doGetBean方法 Spring源码基于的Sprin...

架构师:通透,才能写出好代码! 5769

【Spring详解五】bean的加载

外没有别的处理工作,根据分析,基本可以理清Spring处理循环依赖的解决办法,在B中创建依赖A时通过ObjectFactory提供的实例化方法来获取原始A,使B中持有的A仅仅是刚刚初始化并没有填充任何属性的A,而这初始化A的步骤还是刚刚创建A时进行的,但是因为A与B中的A所表示的属性地址是一样的所以在A中创建好的属性填充自然可以通过B中的A获取,这样就解决了循环依赖的问题。BeanFactory是最基本的抽象工厂,而其他的IOC容器只不过是具体的工厂,对应着各自的Bean定义方法。

叉烧钵钵鸡的博客 1255

Spring core 源码分析 ---- IoC容器(二) getBean

上节提到了在AbstractApplicationContext 调用refresh方法里,初始化所有BeanDefinitions后,遍历所有BeanDefinitionNames后,循环调用BeanFactory的getBean(name)方法,实例化所有容器 Bean对象(非la...

chouse10938的博客 194

Spring源码(3) Spring IoC之BeanFactory创建bean和获取bean

bean 对象主要放在 map 里面,map 作为缓存。map 的key 是 bean对象的名称, value 是 bean 对象或者对象工厂。代码详情见: https://blog.csdn.net/sinat_32502451/article/details/140155044。详情见: https://blog.csdn.net/sinat_32502451/article/details/140247662。根据 bean 名称,返回已经注册的单例对象,如果没有注册,则创建并注册一个新对象。

Cyms,BgXmSfXtsj !!!! Battle Each Moment !!!! 1134

spring中bean的作用域与懒加载及初始化方法和销毁方法以及spring容器的正常关闭...

默认为singleton,prototype会在调用getBean()方法时,也就是第一次真正用到bean时才会实例化。 所谓容器启动时指的是:ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");这句代码执行时。 ========= bean.xml ==...

SYL269794967的博客 295

Spring核心源码学习笔记-02-getBean

@[TOC](Spring源码解析———获取bean getBean )

LeeYan9的博客 246
上一篇: [Spring]new ClassPathXmlApplicationContext("application.xml")做了些什么
下一篇: [Spring]Spring容器扩展点
HeapStackk
博客等级 码龄12年 11粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值