0%

Spring Bean生命周期

一. 什么是bean对象

在普通Java环境下创建对象简要的步骤可以分为:

1):java源码被编译为被编译为class文件

2):等到类需要被初始化时(比如说new、反射等)

3):class文件被虚拟机通过类加载器加载到JVM

4):初始化对象供我们使用

简单来说,可以理解为它是用Class对象作为「模板」进而创建出具体的实例。而Spring所管理的Bean不同的是,除了Class对象之外,还会使用BeanDefinition的实例来描述对象的信息,比如说,我们可以在Spring所管理的Bean有一系列的描述:@Scope、@Lazy、@DependsOn等等。可以理解为Class只描述了类的信息,而BeanDefinition描述了对象的信息。

二. 配置信息

img

Spring在启动的时候需要「扫描」在XML/注解/JavaConfig 中需要被Spring管理的Bean信息,随后,会将这些信息封装成BeanDefinition,最后会把这些信息放到一个beanDefinitionMap中<beanName,BeanDefinition对象>。接着会遍历这个beanDefinitionMap,执行BeanFactoryPostProcessor这个Bean工厂后置处理器的逻辑,之后,就到了实例化对象啦,在Spring里边是通过反射来实现的,一般情况下会通过反射选择合适的构造器来把对象实例化。

三. 管理bean对象

在这里插入图片描述

第1步:调用bean的构造方法创建bean;

第2步:通过反射调用setter方法进行属性的依赖注入;

第3步:如果实现BeanNameAware接口的话,会设置bean的name;

第4步:如果实现了BeanFactoryAware,会把bean factory设置给bean;

第5步:如果实现了ApplicationContextAware,会给bean设置ApplictionContext;

(是否实现了Aware接口,用于对Spring Bean的扩展)

第6步:如果实现了BeanPostProcessor接口,则执行前置处理方法;

(这个BeanPostProcessor后置处理器是AOP实现的关键)

第7步:实现了InitializingBean接口的话,执行afterPropertiesSet方法;

第8步:执行自定义的init方法;

第9步:执行BeanPostProcessor接口的后置处理方法。

这时,就完成了bean的创建过程。

在使用完bean需要销毁时,会先执行DisposableBean接口的destroy方法,然后在执行自定义的destroy方法。

Spring是怎么解决循环依赖的

首先A对象实例化,然后对属性进行注入,发现依赖B对象

B对象此时还没创建出来,所以转头去实例化B对象

B对象实例化之后,发现需要依赖A对象,那A对象已经实例化了嘛,所以B对象最终能完成创建

B对象返回到A对象的属性注入的方法上,A对象最终完成创建

至于原理,其实就是用到了三级的缓存,所谓的三级缓存其实就是三个Map(一级,日常实际获取Bean的地方)(二级,还没进行属性注入,由三级缓存放进来)(三级,Value是一个对象工厂)

我们自己去getBean的时候,实际上拿到的是一级缓存的。

------------- Thank you for reading -------------

Title - Artist
0:00