12. Spring源码篇之创建Bean逻辑doCreateBean

本文深入剖析Spring框架中的doCreateBean方法,涉及bean实例化、BeanPostProcessors应用、循环依赖处理和初始化过程。后续将详述这些关键步骤。

简介

本文只是分析一下doCreateBean的表面代码,其中每块的细节逻辑后续文章分析

在看源码中,我们如果看到前面有一个do,不用质疑,一般都是比较重要的方法比如,doScan doGetBean以及doCreateBean

源码解析

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {

    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
        instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);        // 可能已经创建过了
    }
    if (instanceWrapper == null) {
        // 真正得到一个实例,这里面包括@Bean的逻辑,推断构造方法等,后面介绍
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
        mbd.resolvedTargetType = beanType;
    }

    synchronized (mbd.postProcessingLock) {
        if (!mbd.postProcessed) {
            try {
                // BeanPostProcessors ,spring的一个扩展点,在这里还可以对Beandefinition做修改
                // 例如给属性直接赋值,但是这个时候要去修改beanClass是不行的了
                applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
            }
            catch (Throwable ex) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                        "Post-processing of merged bean definition failed", ex);
            }
            mbd.postProcessed = true;
        }
    }

    // 解决循环依赖逻辑,三级缓存,后面分析
    boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
            isSingletonCurrentlyInCreation(beanName));
    if (earlySingletonExposure) {
        addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    }

    Object exposedObject = bean;
    
    populateBean(beanName, mbd, instanceWrapper); // 属性填充
    exposedObject = initializeBean(beanName, exposedObject, mbd); // 初始化

    // 循环依赖省略...

    // 注册Bean的销毁逻辑
    registerDisposableBeanIfNecessary(beanName, bean, mbd);

    return exposedObject;
}

总结

通过以上代码,大致逻辑是

判断是不是创建过了
没有创建那么实例化出来一个bean对象 --实例化逻辑后面文章介绍
经过一个生命周期扩展点MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition,这一步也是非常的重要,会寻找出一些注入点以便后面属性填充,做依赖注入
循环依赖解决
属性填充 依赖注入
初始化bean 初始化前,初始化后,执行初始化方法等
注册销毁bean的逻辑

以上就是doCreateBean的逻辑,本文只是做一个初探,至于实例化过程,循环依赖解决,属性填充,初始化过程,以及更多的扩展点,后面文章一一分析


欢迎关注,学习不迷路!

15:02:17.751 [restartedMain] ERROR o.s.b.SpringApplication - [reportFailure,854] - Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'captureController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'captureService' defined in file [D:\项目\V1.0版本\后端源码\zkzx-lcjl\ruoyi-admin\target\classes\com\ruoyi\web\controller\capture\CaptureService.class]: Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:332) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at org.s
07-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值