Ioc容器refresh总结(5)--- Spring源码从入门到精通(三十五 )

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Ioc容器refresh总结(5)--- Spring源码从入门到精通(三十五 )

上篇文章主要介绍:

先创建applicationEventMulticaster多播(派发)器,再注册registerListener添加到派发器中,之后下篇文章将介绍如何调用spring监听,这篇文章先介绍bean创建,因为监听在bean创建完成之后调用。

Ioc容器refresh总结(4)--- Spring源码从入门到精通(三十四 )


十一、finishBeanFactoryInitialization


preInstantiateSingletons;初始化剩下的单实例bean。

获取容器中的所有bean,依次进行初始化和创建对象。

获取bean的定义信息:RootBeanDefination

Bean不是抽象,是单实例,不是懒加载,则true;

image.png

a.判断是否是factoryBean,是否是实现factoryBean接口的;不是工厂bean,则用getBean创建对象(ioc容器的getBean方法)。

b.先从缓存中获取保存了单实例的bean,如果能获取到,说明之前被创建过(所有创建过得单实例bean都会被缓存起来Map<String,Object> singleObjects,这里也就是一级缓存)。

image.png

c.缓存中没有的话,开始创建对象流程。

d.markBeanAsCreate()标记当前bean已被创建。(防止多线程的时候创建多个对象导致不是单实例)。

e.获取bean的定义信息。

f.获取当前bean依赖的其他bean。如果存在依赖的bean,通过getBean先创建出来。

image.png

g.启动创建单实例流程;

1).创建createBean;

2).resolveBeforeInstantiation。先获取bean,通过提前执行,先执行beanPostProcessorBeforeInstantiation,如果有返回在执行beanPostProcessorAfterInitialization。

3)如果beanPostProcessorBeforeInstantiation没有返回代理对象,则开始下面的创建bean。

image.png

前面都是预处理,下面开始正式创建bean

4)doCreateBean()方法内需要做的如下:

a、创建bean实例,createBeanInstance利用工厂方法或者对象构造器创建bean实例,里面会determineCandidateConstruct推断使用啥构造器之前。

b、调用postProcessMergedBeanDefination预处理@Autowired@Value

image.png

c、先调用getEarlyBeanReference提早获取bean,防止循环依赖。populate给bean赋值,调用postProcessPropertyValue给bean属性赋值。

image.png

接下来开始bean的初始化

d、initializeBean初始化bean,先执行invokeAwareMethods,执行aware接口的方法。如果组件实现了这些接口beanNameAware,beanClassLoaderAware,beanFactoryAware,则会回调。

e、调用后置处理器beanPostProcessBeforeInitialization调用bean初始化之前的方法。(此处可以实现initializaingBean接口,可以注解@PostConsrtuct,或者和@bean一起用init-method)

f、invokeInitMethods,

1)、判断是否是实现initializaingBean接口初始化。

2)、是否自定义初始化。

g、调用后置处理器beanPostProcessAfterInitizlization调用bean初始化之后的方法。(bean初始化就完成了)

image.png

bean初始化完成后注册bean的销毁方法

h、注册bean的销毁方法(只是注册,调用的时候是容器销毁时候才调用)

beanPostProcessDestruction,@PreDestory,DisposableBean,destory-method调用。

image.png

Bean对象创建出来之后调用addSingleton()方法,将创建的bean添加到一级缓存中。

1、先在初始化对象之前(填充populate对象之前)addSingletonFactory放在三级缓存,并清空二级缓存earlySingleton。在后面getSingleton方法里会清空三级缓存,放入二级缓存earlySingleton。最后bean创建成功会放入一级缓存中。

image.png

相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
1月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
16天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
38 2
|
16天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
27 1
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
63 9
|
28天前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
1月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
47 0
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
79 0
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
223 2
下一篇
DataWorks