zoukankan      html  css  js  c++  java
  • Spring杂记BeanFactory之getBean方法

    1.(BeanFactory) getBean(beanName)
      2.(AbstractBeanFactory) doGetBean
        3.(AbstractBeanFactory) transformedBeanName //如果是&beanName工厂类形式去掉第一个&
        4.(AbstractBeanFactory) getSingleton
          5.(DefaultSingletonBeanRegistry) getSingleton //从Map<String, Object> singletonObjects中获取实例如果存在的话(第一次不存在),有就返回
        6.(AbstractBeanFactory) getParentBeanFactory //看父类中是否包含了该beanName对应的实例,有就返回
        7.(AbstractBeanFactory) markBeanAsCreated(beanName) //this.alreadyCreated.add(beanName)
        8.(AbstractBeanFactory) getMergedLocalBeanDefinition(beanName)
          9.(AbstractBeanFactory) getMergedBeanDefinition(beanName, getBeanDefinition(beanName), null) //查看传入的bd是否有parentName,有的话需要合并。
          10.(AbstractBeanFactory) mbd.setScope(RootBeanDefinition.SCOPE_SINGLETON); //!StringUtils.hasLength(mbd.getScope()),如果该bean内部包含了一个非单例bean就将该bean的scope修正为内部的bean的scope
          11.(AbstractBeanFactory) this.mergedBeanDefinitions.put(beanName, mbd); //cache关系
        12.(AbstractBeanFactory) checkMergedBeanDefinition(mbd, beanName, args) //查看mbd.isAbstract(),是就抛出异常
        13.(AbstractBeanFactory) String[] dependsOn = mbd.getDependsOn(); //将依赖初始化
        14.(AbstractBeanFactory) sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() //如果是单例bean,就调用该方法
          15.(DefaultSingletonBeanRegistry) Object singletonObject = this.singletonObjects.get(beanName); //有就返回
            16.(AbstractBeanFactory) createBean(beanName, mbd, args)
              17.(AbstractAutowireCapableBeanFactory) createBean
                18.(AbstractAutowireCapableBeanFactory) mbd.prepareMethodOverrides
                19.(AbstractAutowireCapableBeanFactory) resolveBeforeInstantiation(beanName, mbd) // Give BeanPostProcessors a chance to return a proxy instead of the target bean 如果这步有bean就返回
                20.(AbstractAutowireCapableBeanFactory) doCreateBean(beanName, mbd, args)
                  21.(AbstractAutowireCapableBeanFactory) createBeanInstance
                    22.如果RootBeanDefinition mbd.getFactoryMethodName() != null就使用工厂方法初始化->instantiateUsingFactoryMethod(beanName, mbd, args)
                    23.如果发现是构造器模式走23.1,否则走23.2
                      23.1.1.(AbstractAutowireCapableBeanFactory) autowireConstructor(beanName, mbd, ctors, args);
                        23.1.2.(ConstructorResolver) autowireConstructor
                        23.1.3.(ConstructorResolver) this.beanFactory.getInstantiationStrategy().instantiate(mbd, beanName, this.beanFactory, constructorToUse, argsToUse);
                          23.1.4.(SimpleInstantiationStrategy) instantiate
                      23.2.1.(AbstractAutowireCapableBeanFactory) instantiateBean(beanName, mbd)
                        23.2.2.(AbstractAutowireCapableBeanFactory) beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
                  24.(AbstractAutowireCapableBeanFactory) populateBean(beanName, mbd, instanceWrapper);//填充属性
                  25.(AbstractAutowireCapableBeanFactory) initializeBean(beanName, exposedObject, mbd)
                    26.(AbstractAutowireCapableBeanFactory) invokeAwareMethods(beanName, bean)
                    27.(AbstractAutowireCapableBeanFactory) applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)
                    28.(AbstractAutowireCapableBeanFactory) invokeInitMethods(beanName, wrappedBean, mbd)
                    29.(AbstractAutowireCapableBeanFactory) applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)
                  30.(AbstractAutowireCapableBeanFactory) registerDisposableBeanIfNecessary(beanName, bean, mbd);
          31.(DefaultSingletonBeanRegistry) addSingleton //this.singletonObjects.put,this.registeredSingletons.add
        32.(AbstractAutowireCapableBeanFactory) getObjectForBeanInstance(sharedInstance, name, beanName, mbd) //如果beanName是&开头的就返回factoryBean
        33.//如果传入的requiredType不为空,则调用 getTypeConverter().convertIfNecessary(bean, requiredType)
      34. return bean
    35. return bean

  • 相关阅读:
    电脑页面放到手机显示时,遇到了一个奇怪的问题:字体的显示大小,与在CSS中指定的大小不一致
    Win 7 安装VMware Workstation Pro 14出现 “Intel VT-x禁用”问题以及“无法连接 MKS: 套接字连接尝试次数太多;正在放弃”问题的实质性解决
    linux下文件权限777了,file_put_contents()却不能写入,为什么?
    Linux常用命令版本CentOS7.x
    sqlserver阻塞
    深入理解sqlserver日志-01
    CentOS添加和删除用户
    root修改sudoers文件
    linux常用命令-持续更新
    CentOS虚拟机设置IP
  • 原文地址:https://www.cnblogs.com/tuifeideyouran/p/6839668.html
Copyright © 2011-2022 走看看