AbstractBeanFactory

在这里插入图片描述

getBean

AbstractBeanFactory#getBean的入参基本上两种

  • Bean的Class对象
  • Bean的name

可以看到,它们最终都调用一个方法

 doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)

在这里插入图片描述
在这里插入图片描述

doGetBean

在这里插入图片描述

参考链接:开启 Bean 的加载

在这里插入图片描述

resolveBeanClass 解析BeanClass

如果mbd中有就直接返回Class
在这里插入图片描述

    protected Class<?> resolveBeanClass(final RootBeanDefinition mbd, String beanName, final Class<?>... typesToMatch) throws CannotLoadBeanClassException {
        try {
            if (mbd.hasBeanClass()) {
                return mbd.getBeanClass();
            } else {
                return System.getSecurityManager() != null ? (Class)AccessController.doPrivileged(new PrivilegedExceptionAction<Class<?>>() {
                    public Class<?> run() throws Exception {
                        return AbstractBeanFactory.this.doResolveBeanClass(mbd, typesToMatch);
                    }
                }, this.getAccessControlContext()) : this.doResolveBeanClass(mbd, typesToMatch);
            }
        } catch (PrivilegedActionException var6) {
            ClassNotFoundException ex = (ClassNotFoundException)var6.getException();
            throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), ex);
        } catch (ClassNotFoundException var7) {
            throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), var7);
        } catch (LinkageError var8) {
            throw new CannotLoadBeanClassException(mbd.getResourceDescription(), beanName, mbd.getBeanClassName(), var8);
        }
    }

doResolveBeanClass
    private Class<?> doResolveBeanClass(RootBeanDefinition mbd, Class<?>... typesToMatch) throws ClassNotFoundException {
        ClassLoader beanClassLoader = this.getBeanClassLoader();
        ClassLoader classLoaderToUse = beanClassLoader;
        if (!ObjectUtils.isEmpty(typesToMatch)) {
            ClassLoader tempClassLoader = this.getTempClassLoader();
            if (tempClassLoader != null) {
                classLoaderToUse = tempClassLoader;
                if (tempClassLoader instanceof DecoratingClassLoader) {
                    DecoratingClassLoader dcl = (DecoratingClassLoader)tempClassLoader;
                    Class[] var7 = typesToMatch;
                    int var8 = typesToMatch.length;

                    for(int var9 = 0; var9 < var8; ++var9) {
                        Class<?> typeToMatch = var7[var9];
                        dcl.excludeClass(typeToMatch.getName());
                    }
                }
            }
        }

        String className = mbd.getBeanClassName();
        if (className != null) {
            Object evaluated = this.evaluateBeanDefinitionString(className, mbd);
            if (!className.equals(evaluated)) {
                if (evaluated instanceof Class) {
                    return (Class)evaluated;
                }

                if (evaluated instanceof String) {
                    return ClassUtils.forName((String)evaluated, classLoaderToUse);
                }

                throw new IllegalStateException("Invalid class name expression result: " + evaluated);
            }

            if (classLoaderToUse != beanClassLoader) {
                return ClassUtils.forName(className, classLoaderToUse);
            }
        }

        return mbd.resolveBeanClass(beanClassLoader);
    }
getObjectForBeanInstance

从bean实例获取对象(getObjectForBeanInstance)
在这里插入图片描述

getMergedLocalBeanDefinition

在这里插入图片描述

getMergedBeanDefinition(String,BeanDefinition)

在这里插入图片描述

在这里插入图片描述

getMergedBeanDefinition(String)

在这里插入图片描述

 return (BeanDefinition)(!this.containsBeanDefinition(beanName) && this.getParentBeanFactory() instanceof ConfigurableBeanFactory ? ((ConfigurableBeanFactory)this.getParentBeanFactory()).getMergedBeanDefinition(beanName) : this.getMergedLocalBeanDefinition(beanName));

//如果BeanDefinitionMap中不包括该Bean并且当前BeanFactory具有ConfigurableBeanFactory 类型的父BeanFactory则从父BeanFactory进行处理。不满足,则执行当前BeanFactory的getMergedLocalBeanDefinition,一般不满足
    }

markBeanAsCreated
  • 将BeanDefinition设置为不新鲜的
  • 将Bean的name放入已创建的缓存中
    在这里插入图片描述

在这里插入图片描述

DefaultListableBeanFactory#clearMergedBeanDefinition

在这里插入图片描述

AbstractBeanFactory#clearMergedBeanDefinition——将Bean设置为不新鲜的,但是没有从缓存中去除

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值