美文网首页
Spring Core 2

Spring Core 2

作者: 金刀止戈 | 来源:发表于2019-07-25 16:21 被阅读0次

    getBean

    所有的getBean方法最终底层都会调用doGetBean方法

    protected <T> T doGetBean(final String name,final Class<T> requiredType,
    final Object[] args, boolean typeCheckOnly) throws BeansException
    
    transformedBeanName

    去掉beanName所有的&前缀,通过aliasMap获取到最终的beanName

    getSingleton 获取提前注册的单例bean🙈
    protected Object getSingleton(String beanName, boolean allowEarlyReference){
            // 先在缓存中获取
            Object singletonObject = this.singletonObjects.get(beanName);
           // 缓存中不存在这个bean并且这个bean正在创建中
            if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
                synchronized (this.singletonObjects) {
                    // 从提前实例化的bean中获取
                    singletonObject = this.earlySingletonObjects.get(beanName);
                    // bean不存在并且运行提前引用未实例化完成的bean
                    if (singletonObject == null && allowEarlyReference) {
                        // 从提前暴露出来的bean中获取引用
                        ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                        if (singletonFactory != null) {
                            // 实例化提前暴露的bean🙈
                            singletonObject = singletonFactory.getObject();
                            // 将实例化的结果放入提前实例化的earlySingletonObjects中
                            this.earlySingletonObjects.put(beanName, singletonObject);
                            // 从提前暴露出来的bean引用中去掉
                            this.singletonFactories.remove(beanName);
                        }
                    }
                }
            }
            return singletonObject;
        }
    

    缓存中未获取到bean:
    原型bean判断是否有有循环依赖(当前需要获取的bean正在创建中)
    如果存在父beanFactory容器,从父容器中获取

    typeCheckOnly为false,标记当前bean为已创建,加入到alreadyCreated中,并从mergedBeanDefinitions从清除该bean
    获取当前beanDefinition,获取依赖列表,并维护到dependentBeanMap和dependenciesForBeanMap中,实例化依赖的bean
    单例bean:
    getSingleton()
    singletonObjects中获取
    beforeSingletonCreation:
    加入正在创建列表singletonsCurrentlyInCreation中
    ObjectFactory创建bean
    createBean:
    <重点重点重重点>
    afterSingletonCreation:
    从正在创建列表singletonsCurrentlyInCreation中删除
    addSingleton:维护实例化好的bean实例

    protected void addSingleton(String beanName, Object singletonObject) {
        synchronized (this.singletonObjects) {
            this.singletonObjects.put(beanName, singletonObject);
            this.singletonFactories.remove(beanName);
            this.earlySingletonObjects.remove(beanName);
            this.registeredSingletons.add(beanName);
        }
    }
    

    原型bean:
    beforePrototypeCreation
    加入正在创建列表prototypesCurrentlyInCreation
    createBean:
    <重点重点重重点>
    afterPrototypeCreation
    从正在创建列表prototypesCurrentlyInCreation中删除
    其他scope:🙈
    根据scope封装不同的获取策略

    createBean

    resolveBeanClass解析beanClass
    BeanPostProcessor=》InstantiationAwareBeanPostProcessor
    实例化前的扩展点:postProcessBeforeInstantiation、postProcessAfterInitialization🚩
    doCreateBean:
    createBeanInstance创建bean实例
    instantiateUsingFactoryMethod factory-method
    autowireConstructor 构造器 SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
    instantiateBean 实例化bean
    默认构造函数构造
    MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
    是否运行提前暴露:earlySingletonExposure

    protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
      Assert.notNull(singletonFactory, "Singleton factory must not be null");
      synchronized (this.singletonObjects) {
        if (!this.singletonObjects.containsKey(beanName)) {
          // 在singletonFactories中暴露
          this.singletonFactories.put(beanName, singletonFactory);
          this.earlySingletonObjects.remove(beanName);
          // 在registeredSingletons中暴露
          this.registeredSingletons.add(beanName);
         }
       }
    }
    

    初始化bean实例
    InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation🚩
    populateBean 处理IOC注入逻辑autowireByName,autowireByType
    InstantiationAwareBeanPostProcessor#postProcessPropertyValues🚩
    初始化 initializeBean
    invokeAwareMethods 处理BeanNameAware/BeanClassLoaderAware/BeanFactoryAware🚩
    BeanPostProcessor#postProcessBeforeInitialization🚩
    InitializingBean#afterPropertiesSet🚩
    initMethodName执行🚩
    BeanPostProcessor#postProcessAfterInitialization🚩

    getObjectForBeanInstance

    beanName以&开头,实例不是FactoryBean实现类,报错
    实例不是FactoryBean实现类或beanName以&开头,返回实例
    beanName不以&开头并且实例是FactoryBean实现类
    传入beanDefinition为空,尝试从factoryBeanObjectCache缓存中获取
    getObjectFromFactoryBean
    factory.getObject()
    非合成的bean,BeanPostProcessor处理
    postProcessObjectFromFactoryBean=》beanProcessor.postProcessAfterInitialization

    变量:
    Set<String> singletonsCurrentlyInCreation
    Map<String, ObjectFactory<?>> singletonFactories
    Map<String, Object> earlySingletonObjects
    Map<String, Object> factoryBeanObjectCache
    Map<String, BeanDefinition> beanDefinitionMap
    Map<String, RootBeanDefinition> mergedBeanDefinitions
    ThreadLocal<Object> prototypesCurrentlyInCreation
    Set<String> alreadyCreated
    Map<String, Set<String>> dependentBeanMap
    Map<String, Set<String>> dependenciesForBeanMap

    相关文章

      网友评论

          本文标题:Spring Core 2

          本文链接:https://www.haomeiwen.com/subject/xmkolctx.html