【Spring6源码・IOC】Bean的实例化

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

上一节我们讲到《【Spring6源码・IOC】BeanDefinition的加载》这一节我们来讲解一下Bean的实例化。

根据xml或注解加载完Bean的信息后最终会通过反射来创建bean的对象。

invokeBeanFactoryPostProcessors()主要是加载BeanDefinition。

finishBeanFactoryInitialization这个方法就是实例化的入口。
在这里插入图片描述

步入这个方法最后会调用DefaultListableBeanFactory#preInstantiateSingletons来加载所有懒加载的Bean。
在这里插入图片描述

步入这个方法中首先将我们之前加载的Bean信息BeanDefinition放进一个新的List集合中而后循环遍历每一个Bean做相关操作。

进入getBean()方法之后这离会有一个核心方法doGetBean()
在这里插入图片描述
我们来仔细看一下这个AbstractBeanFactory#doGetBean方法

首先会根据beanName通过getSingleton()方法从缓存中获取对象的bean可是此时该Bean还未进行实例化所以返回的是null。

在这里插入图片描述
进入getSingleton()方法中首先会从一级缓存中查找对象此时一定是没有的接下来通过isSingletonCurrentlyInCreation(beanName)来判断该Bean是否正在创建中当然也是没有。所以上面返回的对象sharedInstance为null。

进而进入else分支首先判断这个bean有没有依赖其他的bean也就是说是否有@DependsOn注解如果有的话会在该bean创建之前实例化@DependsOn注解中的bean我们这个bean显然没有而后会判断该bean是否是单例的。

在这里插入图片描述

因为我们没有做任何配置故其默认就是单例的。

如下

同样是调用了getSingleton方法与上面不同的是这里传入了一个lambda函数这一看就是创建bean的嘛我们来看一看。

在这里插入图片描述
步入这个getSingleton方法首先从一级缓存中获取该bean因为仍未进行实例化故为null。

进而会调用ObjectFactory#getObject从而调用我们的lambda函数去创建bean。
在这里插入图片描述
看这个lambda函数

sharedInstance = getSingleton(beanName, () -> {
	try {
		return createBean(beanName, mbd, args);
	}
});

在这里插入图片描述
这个createBean方法中有一个关键的方法doCreateBean

让我们看一看因为我们还未进行初始化所以instanceWrapper为null则createBeanInstance(beanName, mbd, args)为创建bean的方法

在这里插入图片描述
步入该方法最后进入instantiateBean方法进行bean的实例化。
在这里插入图片描述
这个方法中我们通过BeanDefinition、beanName、和当前容器去创建bean并且将其返回。
在这里插入图片描述
我们来看看是如何创建的。

首先获取构造器然后将构造器传入BeanUtils.instantiateClass(constructorToUse)

在这里插入图片描述

进入该方法发现都是我们的熟悉的流程哈哈哈哈首先通过构造器获取构造参数显然我们这里的构造方法为无参构造方法所以parameterCount为0调用197行代码。如果有参数的话就会调用210行代码就此我们的bean实例化成功。
在这里插入图片描述
最后把已经实例化但未经初始化的bean放进第三级缓存中宣告着bean的实例化彻底结束。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring