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


    简介

    本文只是分析一下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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    总结

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

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

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


    欢迎关注,学习不迷路!

  • 相关阅读:
    Android 13.0 锁屏页面禁止下拉状态栏
    深度学习笔记Week5
    口袋参谋:淘宝生意参谋指数,如何一键转换成真实数值?
    使用JQ获取并渲染三级联动分类数据
    Django 入门学习总结5
    Python 爬虫基础入门知识
    基础—SQL—DQL(数据查询语言)分页查询
    【opencv-c++】cv::createShapeContextDistanceExtractor形状上下文距离匹配算法
    React介绍
    【STM32】学习笔记(TIM定时器)
  • 原文地址:https://blog.csdn.net/weixin_44412085/article/details/134493277