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

相关文章
|
10天前
|
小程序 JavaScript Java
高校宿舍信息|基于Spring Boot的高校宿舍信息管理系统的设计与实现(源码+数据库+文档)
高校宿舍信息|基于Spring Boot的高校宿舍信息管理系统的设计与实现(源码+数据库+文档)
18 0
|
17天前
|
XML Java 数据格式
Spring框架入门:IoC与DI
【5月更文挑战第15天】本文介绍了Spring框架的核心特性——IoC(控制反转)和DI(依赖注入)。IoC通过将对象的创建和依赖关系管理交给容器,实现解耦。DI作为IoC的实现方式,允许外部注入依赖对象。文章讨论了过度依赖容器、配置复杂度等常见问题,并提出通过合理划分配置、使用注解简化管理等解决策略。同时,提醒开发者注意过度依赖注入和循环依赖,建议适度使用构造器注入和避免循环引用。通过代码示例展示了注解实现DI和配置类的使用。掌握IoC和DI能提升应用的灵活性和可维护性,实践中的反思和优化至关重要。
34 4
|
17天前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
32 6
|
4天前
|
存储 Java 程序员
Spring (IoC & DI)
Spring (IoC & DI)
15 2
|
8天前
|
Java 容器 Spring
Spring的加载配置文件、容器和获取bean的方式
Spring的加载配置文件、容器和获取bean的方式
19 3
Spring的加载配置文件、容器和获取bean的方式
|
8天前
|
Java Spring 容器
Spring核心概念、IoC和DI的认识、Spring中bean的配置及实例化、bean的生命周期
Spring核心概念、IoC和DI的认识、Spring中bean的配置及实例化、bean的生命周期
26 0
|
10天前
|
小程序 JavaScript Java
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
19 0
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
|
10天前
|
安全 JavaScript Java
在线问卷调查|基于Spring Boot的在线问卷调查系统的设计与实现(源码+数据库+文档)
在线问卷调查|基于Spring Boot的在线问卷调查系统的设计与实现(源码+数据库+文档)
22 0
|
17天前
|
XML Java 程序员
Spring特性之二——IOC控制反转
Spring特性之二——IOC控制反转
24 4
|
17天前
|
XML Java uml
spring 源码解析——第一篇(ioc xml方式)
spring 源码解析——第一篇(ioc xml方式)
35 0