基本信息
文件名称:Spring源码:Bean的生命周期(二).docx
文件大小:18.91 KB
总页数:7 页
更新时间:2025-05-20
总字数:约6.61千字
文档摘要

Spring源码:Bean的生命周期(二)

让我们继续讲解Spring的Bean实例化过程。在上一节中,我们已经讲解了Spring是如何将Bean定义加入到IoC容器中,并使用合并的Bean定义来包装原始的Bean定义。接下来,我们将继续讲解Spring的getBean()方法,特别是针对FactoryBean的解析。

在getBean()方法中,Spring还支持对FactoryBean进行特殊处理。FactoryBean是一个能够生成Bean实例的工厂Bean,其定义了getObject()方法,返回的是一个由工厂Bean管理的对象实例。在使用getBean()方法获取FactoryBean类型的Bean时,Spring会首先获取FactoryBean的实例,然后调用其getObject()方法来获取由工厂Bean创建的实际Bean实例。

因此,在使用getBean()方法获取Bean实例时,我们需要注意是否需要对FactoryBean进行特殊处理。如果需要获取FactoryBean的实例而不是它所管理的对象实例,可以在Bean名称前加上符号来进行标识。例如:myFactoryBean表示获取myFactoryBean的实例。但是博主看到第一篇源码写的篇幅确实有些长,可能对于大家伙的碎片化时间掌握的不是很充分,所以以后我会尽力控制篇幅长度,既保证逻辑的连续性也保证尽快可以看完,那么接下来开始进入正题getbean方法之FactoryBean解析。

FactoryBean

所有符合过滤条件的Bean在Spring解析后都会被转化为合并后的Bean定义。尽管Spring提供了getBean()方法用于获取Bean实例,但实际上它底层仍然使用createBean()方法来创建Bean实例。在创建Bean实例之前,Spring先对当前Bean定义进行判断,以确定其是否为FactoryBean类型:

publicvoidpreInstantiateSingletons()throwsBeansException{

if(logger.isTraceEnabled()){

logger.trace(Pre-instantiatingsingletonsin+this);

//Iterateoveracopytoallowforinitmethodswhichinturnregisternewbeandefinitions.

//Whilethismaynotbepartoftheregularfactorybootstrap,itdoesotherwiseworkfine.ListStringbeanNames=newArrayList(this.beanDefinitionNames);

//Triggerinitializationofallnon-lazysingletonbeans...

for(StringbeanName:beanNames){

//获取合并后的BeanDefinition

RootBeanDefinitionbd=getMergedLocalBeanDefinition(beanName);

if(!bd.isAbstract()bd.isSingleton()!bd.isLazyInit()){

if(isFactoryBean(beanName)){

//获取FactoryBean对象

Objectbean=getBean(FACTORY_BEAN_PREFIX+beanName);

if(beaninstanceofFactoryBean){

FactoryBeanfactory=(FactoryBean)bean;

booleanisEagerInit;

if(System.getSecurityManager()!=nullfactoryinstanceofSmartFactoryBean){

isEagerInit=AccessController.doPrivileged(

(PrivilegedActionBoolean)((SmartFactoryBean)factory)::isEagerInit,

getAccessCo