Spring容器的refresh() 过程三、核心bean创建流程

spring容器的创建过程 阅读详情

initApplicationEventMulticaster方法在spring 事件监听器原理分析 的时候有分析过,可以参考下,下面主要分析finishBeanFactoryInitialization方法

@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
				initMessageSource();

				// Initialize event multicaster for this context.
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
				onRefresh();

				// Check for listener beans and register them.
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				finishRefresh();
			}

			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}

				// Destroy already created singletons to avoid dangling resources.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}

			finally {
				// Reset common introspection caches in Spring's core, since we
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
			}
		}
	}

其中,核心方法主要为beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean
在这里插入图片描述
进入该方法

在这里插入图片描述
进入getBean方法
在这里插入图片描述
在这里插入图片描述
先获取缓存中保存的单实例Bean。如果能获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来),从private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);获取的
在这里插入图片描述
缓存中获取不到,开始Bean的创建对象流程;
在这里插入图片描述
进入bean创建流程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里如果返回值为空,跳到上一步
在这里插入图片描述
在这里插入图片描述
进入该方法初始化属性
在这里插入图片描述

1)、拿到InstantiationAwareBeanPostProcessor后置处理器;postProcessAfterInstantiation();
2)、拿到InstantiationAwareBeanPostProcessor后置处理器;postProcessPropertyValues();
3)、应用Bean属性的值;为属性利用setter方法等进行赋值;applyPropertyValues(beanName, mbd, bw, pvs);

在这里插入图片描述
在这里插入图片描述
执行完毕,跳到上一步,进入initializeBean方法
在这里插入图片描述
在这里插入图片描述

跳到上一步 注册Bean的销毁方法;
在这里插入图片描述
跳到上一步,进入getSingleton方法
在这里插入图片描述
进入addSingleton方法
在这里插入图片描述
跳到preInstantiateSingletons方法中
在这里插入图片描述

finishRefresh方法

完成BeanFactory的初始化创建工作;IOC容器就创建完成;
1)、initLifecycleProcessor();初始化和生命周期有关的后置处理器;LifecycleProcessor
默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor();
加入到容器;
写一个LifecycleProcessor的实现类,可以在BeanFactory
void onRefresh();
void onClose();
2)、 getLifecycleProcessor().onRefresh();
拿到前面定义的生命周期处理器(BeanFactory);回调onRefresh();
3)、publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件;
4)、liveBeansView.registerApplicationContext(this);

在这里插入图片描述

总结:
10、registerListeners();给容器中将所有项目里面的ApplicationListener注册进来;
		1、从容器中拿到所有的ApplicationListener
		2、将每个监听器添加到事件派发器中;
			getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
		3、派发之前步骤产生的事件;
11、finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean;
	1、beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean
		1)、获取容器中的所有Bean,依次进行初始化和创建对象
		2)、获取Bean的定义信息;RootBeanDefinition
		3)、Bean不是抽象的,是单实例的,是懒加载;
			1)、判断是否是FactoryBean;是否是实现FactoryBean接口的Bean;
			2)、不是工厂Bean。利用getBean(beanName);创建对象
				0、getBean(beanName); ioc.getBean();
				1、doGetBean(name, null, null, false);
				2、先获取缓存中保存的单实例Bean。如果能获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)
					从private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);获取的
				3、缓存中获取不到,开始Bean的创建对象流程;
				4、标记当前bean已经被创建
				5、获取Bean的定义信息;
				6、【获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来;】
				7、启动单实例Bean的创建流程;
					1)、createBean(beanName, mbd, args);
					2)、Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor先拦截返回代理对象;
						【InstantiationAwareBeanPostProcessor】:提前执行;
						先触发:postProcessBeforeInstantiation();
						如果有返回值:触发postProcessAfterInitialization();
					3)、如果前面的InstantiationAwareBeanPostProcessor没有返回代理对象;调用4)
					4)、Object beanInstance = doCreateBean(beanName, mbdToUse, args);创建Bean
						 1)、【创建Bean实例】;createBeanInstance(beanName, mbd, args);
						 	利用工厂方法或者对象的构造器创建出Bean实例;
						 2)、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
						 	调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName);
						 3)、【Bean属性赋值】populateBean(beanName, mbd, instanceWrapper);
						 	赋值之前:
						 	1)、拿到InstantiationAwareBeanPostProcessor后置处理器;
						 		postProcessAfterInstantiation();
						 	2)、拿到InstantiationAwareBeanPostProcessor后置处理器;
						 		postProcessPropertyValues();
						 	=====赋值之前:===
						 	3)、应用Bean属性的值;为属性利用setter方法等进行赋值;
						 		applyPropertyValues(beanName, mbd, bw, pvs);
						 4)、【Bean初始化】initializeBean(beanName, exposedObject, mbd);
						 	1)、【执行Aware接口方法】invokeAwareMethods(beanName, bean);执行xxxAware接口的方法
						 		BeanNameAware\BeanClassLoaderAware\BeanFactoryAware
						 	2)、【执行后置处理器初始化之前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
						 		BeanPostProcessor.postProcessBeforeInitialization();
						 	3)、【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);
						 		1)、是否是InitializingBean接口的实现;执行接口规定的初始化;
						 		2)、是否自定义初始化方法;
						 	4)、【执行后置处理器初始化之后】applyBeanPostProcessorsAfterInitialization
						 		BeanPostProcessor.postProcessAfterInitialization();
						 5)、注册Bean的销毁方法;
					5)、将创建的Bean添加到缓存中singletonObjects;
				ioc容器就是这些Map;很多的Map里面保存了单实例Bean,环境信息。。。。;
		所有Bean都利用getBean创建完成以后;
			检查所有的Bean是否是SmartInitializingSingleton接口的;如果是;就执行afterSingletonsInstantiated();
12、finishRefresh();完成BeanFactory的初始化创建工作;IOC容器就创建完成;
		1)、initLifecycleProcessor();初始化和生命周期有关的后置处理器;LifecycleProcessor
			默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor();
			加入到容器;
			
			写一个LifecycleProcessor的实现类,可以在BeanFactory
				void onRefresh();
				void onClose();	
		2)、	getLifecycleProcessor().onRefresh();
			拿到前面定义的生命周期处理器(BeanFactory);回调onRefresh();
		3)、publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件;
		4)、liveBeansView.registerApplicationContext(this);
	
	======总结===========
	1)、Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;
		1)、xml注册bean;<bean>
		2)、注解注册Bean;@Service、@Component、@Bean、xxx
	2)、Spring容器会合适的时机创建这些Bean
		1)、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
		2)、统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();
	3)、后置处理器;BeanPostProcessor
		1)、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
			AutowiredAnnotationBeanPostProcessor:处理自动注入
			AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
			xxx....
			增强的功能注解:
			AsyncAnnotationBeanPostProcessor
			....
	4)、事件驱动模型;
		ApplicationListener;事件监听;
		ApplicationEventMulticaster;事件派发:
Spring容器加载过程分析 IOC类图结构 各个接口的作用 接口名 说明 BeanFactory 定义了基本IOC容器的规范,包含像getBean()这样的IOC容器的基本方法 HierarchicalBeanFactory 增加了getParentBeanFactory()的接口功能,使BeanFactory具备了双亲IOC接口的关联功能 ConfigurableBeanFactory 主要定义了... 阅读详情

相关推荐

微信小程序URL Link全解析:从生成原理到实战应用(附Java代码)

本文深入解析微信小程序URL Link的生成原理与实战应用。URL Link是微信官方提供的智能路由协议,通过中间页实现外部链接安全跳转至小程序指定页面。文章详细阐述了其权限模型、环境版本差异及跳转机制,并提供了包含令牌管理、异常处理和性能优化的健壮Java实现方案,助力开发者构建高可用的链接生成服务。

weixin_29327525的博客 1219

Spring系列(三) 从refresh看createBean源码解析

createBean解析 spring当中单例bean的创建原理,其中涉及到了非常多阶段及各种处理器的调用 启动代码 通过注解配置类AppConfig启动一个容器,其中添加了一个自定义的beanFactoryPostProcessor, 注意:这个类是直接添加到beanFactoryPostProcessors中的,没有被spring当成bean放到单例map中 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationC

Shine的博客 305

【拯救C盘】一文搞懂Windows修改Anaconda默认的虚拟环境存放路径及其原理

Anaconda创建的虚拟环境可能会默认保存在C盘,但C盘的存储空间很宝贵,由于每个虚拟环境的大小可能达到n个GB,稍不注意就会遇到C盘红色警告。因此有必要做点什么来拯救被虚拟环境占用的大部分空间!!!

Roach007的博客 3万+

Spring refresh() 方法详解(启动Spring,bean的创建过程)

Spring refresh方法详解一. refresh() 方法预览二. refresh() 方法中调用的每个方法1. this.prepareRefresh() 激活开启容器2. this.obtainFreshBeanFactory() 获取 bean 工厂3. this.prepareBeanFactory(beanFactory) 对获取到的 beanFactory 做预处理设置4. t...

qq_29799655的博客 8417

Direct-LiNGAM算法理解

现在是大数据的时代,数据即是财富。那么如何从数据中发现因果关系呢?这是我们促进我们更加高效利用数据的一个问题?本文介绍了一种方法,可以在符合条件的观察数据中恢复出数据背后的因果结构,帮助我们更好理解数据的产生机制。

小小程序猿的博客 4592

打开UG会安装报错:initialization internal ERROR 的提示框,提示line 1344 of错误的解决方案

打开UG会安装报错:initialization internal ERROR 的提示框,提示line 1344 of错误的解决方案

Q82556499的博客 3522

spring-refresh()方法中ConfigurableListableBeanFactory beanFactory 创建流程Bean加载注册的流程

@Override public void refresh() throws BeansException, IllegalStateException { /** * 加锁,说明并发执行,很多地方都有调用 * registerShutdownHook 也调用了 * close()方法也调有了, * 容器在启动时,不能调Close的方法 */ synchronized (this.startupShutdownMonitor) { // Prepare this

小城我家 2730

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

算法大师! 629

Spring系列之IOC容器的初始化过程九

refresh方法中的finishRefresh方法 闲话先不聊,咱们直接开始今天的主题,今天我们讲解的是refresh方法中的finishRefresh方法 finishRefresh 发布相应事件 完成此上下文的刷新,调用 LifecycleProcessor 的 onRefresh() 方法并发布ContextRefreshedEvent protected void finishRefresh() { // Initialize lifecycle processor for this c

a_ittle_pan的博客 356

YOLOv11改进 | 特殊场景检测篇 | 利用图像去雾网络UnfogNet改进yolov11图像雾天检测能力(全网独家首发改进)

本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv11针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv11的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可以忽略不计这是非常难得的,因为其也算是一种图像增强算法,同时本文的内容不影响其它的模块改进可以作为工作量凑近大家的论文里,非常的适用,图像去雾检测为群友最近提出的需要的改进。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 1629

【Unity-UGUI控件全面解析】| Layout自动布局组件详解

UGUI中有个自动布局组件Auto Layout,主要包含下面几个模块(点击可进入官方文档下查看描述): 自动布局 布局元素 (Layout Element) 水平布局组 (Horizontal Layout Group) 垂直布局组 (Vertical Layout Group) 网格布局组 (Grid Layout Group) 内容大小适配器 (Content Size Fitter) 自动布局系统 基于布局元素和布局控制器的概念。一个布局元素是具有矩形变换以及其他可选组件的游戏对象。布局元素对自身

努力前行,总会成为自己心中的那道光 2万+

Spring源码解析十五

上一篇中,我们对容器ApplicationContext的初始化环节开始了初步的分析,我们已经找到了初始化的核心方法refresh。接下来我们看下refresh方法中做了哪些事情。 我们回到refresh方法: 可以看到,首先调用prepareRefresh方法,根据方法名我们可以知道是在为容器的初始化做一些准备工作。 我们到prepareRefresh方法里面看下: 可以看到,在prepareRefresh方法中大多数是一些初始化工作,比如设置容器的开始初始化的时间startupDate、设置容器状态

qq_35873436的博客 659

【Bug已解决】Codex Desktop 更新后无法启动/闪退解决方案

方案适用场景推荐指数清理本地缓存重启最常见、最应优先尝试的方案⭐⭐⭐⭐⭐完全卸载重装缓存清理无效时的进阶方案⭐⭐⭐⭐详细日志定位崩溃环节需要精确诊断问题原因⭐⭐⭐⭐锁定旧稳定版本确认是特定版本缺陷时的过渡方案⭐⭐⭐反馈官方支持团队自助方式无效时的最终途径⭐⭐⭐⭐Codex Desktop 更新后无法启动/闪退的本质通常是新版本程序在启动时读取到了旧版本遗留的、格式不兼容的本地缓存或配置数据,导致启动流程中途崩溃。

一键难忘的博客 6289

Spring学习之浅析refresh()执行逻辑

目录概览refresh明细1.prepareRefresh2.obtainFreshBeanFactory3.prepareBeanFactory4.postProcessBeanFactory5. invokeBeanFactoryPostProcessors6.registerBeanPostProcessors7.initMessageSource8.initApplicationEventMulticaster9.onRefresh10.registerListeners11.finishBeanF

增量星球 8845

计算机控制技术及应用

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring refresh()源码详解

Spring refresh()源码详解

qq_34573913的博客 1628

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入理解 Spring ApplicationContext 的 refresh() 方法:容器启动的核心流程

摘要:Spring框架中ApplicationContext.refresh()方法是容器初始化的核心流程,包含12个关键步骤。从准备刷新环境、创建BeanFactory,到配置标准特性、执行后置处理器,再到实例化单例Bean和发布完成事件,该方法采用模板模式确保扩展性和安全性。文章详细解析了每个步骤的作用和调试要点,特别强调了BeanFactoryPostProcessor和BeanPostProcessor的执行顺序,以及单例Bean初始化的性能优化。同时提供了自定义扩展refresh流程的示例,并针对

刘一说的IT专栏 1667

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【小家Spring】Spring IOC容器启动流程 AbstractApplicationContext#refresh()方法源码分析(一)

前言 还记得我在这篇博文:【小家Spring】Spring容器(含父子容器)的启动过程源码级别分析(含web.xml启动以及全注解驱动,和ContextLoader源码分析) 里留了几个非常重要,但是没有解释的方法。其中有一个非常重要的方法ApplicationContext#refresh()方法就是提到两次但都暂时忽略了(因为有父子容器,所以会刷新两次容器~) refresh()方法是Spri...

架构师:通透,才能写出好代码! 1万+

Spring源码分析一:容器的刷新 - refresh()

Spring源码分析一:容器的刷新 - refresh()

我从不打没有准备的仗! 1万+

Spring容器的refresh()方法

做一些初始化的工作,如果没有其他Bean后处理器(如PropertyPlaceholderConfigurer)注册嵌入值解析器,清理临时类加载器,调用freezeConfiguration()方法缓存所有Bean定义元数据,实例化所有剩余的非懒加载单例bean,这是整个Spring容器初始化过程中的关键一步,真正创建Bean实例。其中BeanFactoryPostProcessor有多种实现,有些需要排序,有些不需要排序,导致执行的顺序也是不一样了。完成刷新过程的最后步骤,发布相应的上下文刷新完成事件。

m0_46433333的博客 1272

通过Debug带你详细了解Spring创建Bean的过程,一清二楚!

作者:x1aoda1cnblogs.com/darope/p/13917264.html目录Spring流程Debug方法1:prepareRefresh() => 准备工作方法2...

Java笔记虾 2435

spring核心之Bean加载过程剖析

此文是从spring框架的源码进行剖析Bean加载的一个过程 从springboot程序入口开始剖析

qq_42394044的博客 3233

Spring 启动流程refresh()源码解析之一

Spring 启动流程源码解析之一一、Spring容器的refresh()spring version:4.3.12 ,尚硅谷Spring注解驱动开发—源码部分//refresh():543, AbstractApplicationContext (org.springframework.context.support) public void refresh() throws BeansE...

yangliuhbhd的博客 6917

Spring 6 IOC容器加载过程与核心方法refresh源码浅析

本篇只对主线核心逻辑进行梳理分析,本篇以AnnotationConfigApplicationContext容器为例进行切入分析【Spring版本为: v6.0.2】

1 Byte 的博客 3340

Spring02-容器初始化的核心入口:refresh()

Spring,容器初始化的核心入口,ApplicationContext容器初始化的核心入口

hong4760的专栏 804

Spring 容器刷新流程(refresh)源码全解

Spring容器刷新流程摘要 Spring容器的启动通过refresh()方法实现,分为6个主要阶段: 准备阶段:初始化环境属性,验证必须配置,记录启动时间 BeanFactory创建:加载Bean定义,配置基础组件和环境 后处理阶段:执行BeanFactoryPostProcessor扩展点,注册BeanPostProcessor 事件系统初始化:建立消息源和事件广播器,注册监听器 Bean实例化:完成所有非懒加载单例的初始化 完成启动:发布上下文刷新事件,启动生命周期组件 该流程通过同步机制保证线程安全

qq_43414012的博客 1001

Spring源码解析之零 ------ 容器初始化过程(refresh()方法)概要

本篇主要讲解,容器初始化时候的refresh()方法里的,几个重要方法的基本作用。 首先来看一下refresh()方法。spring容器的启动,创建bean,bean的初始化等一系列过程都在这个refresh方法里面,进行调用。 public void refresh() throws BeansException, IllegalStateException { synchro

怪盗基德 5653
上一篇: Spring容器的refresh() 过程 二、
下一篇: Redis问题总结(序列化&事务&集群)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值