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

相关文章
|
11天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
21 0
|
3天前
|
安全 Java 数据库连接
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
|
3天前
|
存储 前端开发 Java
Spring Boot自动装配的源码学习
【4月更文挑战第8天】Spring Boot自动装配是其核心机制之一,其设计目标是在应用程序启动时,自动配置所需的各种组件,使得应用程序的开发和部署变得更加简单和高效。下面是关于Spring Boot自动装配的源码学习知识点及实战。
12 1
|
4天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
45 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
11天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
21 0
|
11天前
|
XML Java 程序员
什么是Spring的IoC容器?
【4月更文挑战第30天】什么是Spring的IoC容器?
19 0
|
12天前
|
设计模式 安全 Java
【初学者慎入】Spring源码中的16种设计模式实现
以上是威哥给大家整理了16种常见的设计模式在 Spring 源码中的运用,学习 Spring 源码成为了 Java 程序员的标配,你还知道Spring 中哪些源码中运用了设计模式,欢迎留言与威哥交流。
|
14天前
|
Java Spring 容器
【Spring系列笔记】IOC与DI
IoC 和 DI 是面向对象编程中的两个相关概念,它们主要用于解决程序中的依赖管理和解耦问题。 控制反转是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入和依赖查找。
30 2
|
1天前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
10 0
|
2天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复