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

Spring杂记BeanFactory之getBean方法的更多相关文章

  1. Spring之BeanFactory:解析getBean()方法

    初探getBean()方法 在使用Spring的时候可以通过如下方式调用getBean方法来获取某个Bean: User user = context.getBean(User.class); Abs ...

  2. 九、Spring之BeanFactory源码分析(一)

    Spring之BeanFactory源码分析(一) ​ 注意:该随笔内容完全引自https://blog.csdn.net/u014634338/article/details/82865644,写的 ...

  3. spring getbean 方法分析

    spring 缺省: 1.spring用DefaultListableBeanFactory.preInstantiateSingletons()建立bean实例 2.缺省采用单例模式 在最近的项目中 ...

  4. spring getbean 方法分析(很实用!)

    十年阿里,就只剩下这套Java开发体系了 >>>   在最近的项目中,有个地方我们不得不实用getBean的方法,自己从Spring context中获取bean进行数据库操作. 方 ...

  5. Spring IoC getBean 方法详解

    前言 本篇文章主要介绍 Spring IoC 容器 getBean() 方法. 下图是一个大致的流程图: 正文 首先定义一个简单的 POJO,如下: public class User { priva ...

  6. Spring ioc 源码分析之--beanFactory.registerResolvableDependency()方法

    背景: 在spring ioc refresh()方法中,看到了如下逻辑: 要理解该逻辑的原理,先看场景:有个接口InterFaceA,它有2个实现类A1和A2 那么,如果一个类C 依赖了InterF ...

  7. 模拟Spring中的getBean方法

    一直知道Spring是运用反射技术的,但具体怎么用呢?今天就模拟下getBean方法. 步骤: 1.用Dom4j解析xml配置文件,取出我们需要的信息 2.遍历Bean节点,根据每个Bean节点的cl ...

  8. 模拟Spring容器的getBean方法(Maven工程)

    Spring容器的getBean方法是通过反射机制实现的,下面的测试程序模拟getBean的实现原理. 步骤一:pom.xml文件配置解析XML文件的dom4j.jar 步骤二:XML文件中配置bea ...

  9. Spring之BeanFactory及Bean生命周期

    1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...

随机推荐

  1. tiny4412 --uboot移植(2) 点灯

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  2. Python3,x:Fiddler抓包工具如何进行手机APP的数据爬取

    示例一:苹果手机抓取教程 https://www.cnblogs.com/lizm166/p/8693085.html https://blog.csdn.net/cui130/article/det ...

  3. P1495 曹冲养猪(拓展欧几里得)

    题目描述 自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把.举个例子,假如有 ...

  4. 深入理解JVM(二)Java内存区域

    2.1 C.C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理 2.2 JVM运行时数据区:方法区.堆(运行时线程共享),虚拟机栈.本地方法栈.程序计数器(运行时线程隔离,私有) 1 ...

  5. Knockout.js快速学习笔记

    原创纯手写快速学习笔记(对官方文档的二手理解),更推荐有时间的话读官方文档 框架简介(Knockout版本:3.4.1 ) Knockout(以下简称KO)是一个MVVM(Model-View-Vie ...

  6. xbeePROS1发送的数据在802.15.4网络中有多大时延?

    完整的计算过程请参考Digi官方网站的文章:Sending data through an 802.15.4 network latency timing. Digi的S1模块可以跑802.15.4固 ...

  7. C++ MFC棋牌类小游戏day4

    根据昨天的计划,今天开始做下面的内容. 1.鼠标点击事件 2.点击坐标进行处理.(坐标转换) 3.判断选中的位置是否有效. 4.确定选中的棋子,设置棋子的状态和棋子所在坐标的状态. 5.判断移动是否有 ...

  8. Paper | 亚像素运动补偿 + 视频超分辨

    目录 1. ABSTRACT 2. INTRODUCTION 3. RELATED WORKS 4. SUB-PIXEL MOTION COMPENSATION (SPMC) 5. OUR METHO ...

  9. Pattern Design - Strategy Pattern

    If you can disassemble code  and  you want to apply one method of an object in another object that t ...

  10. 第四章 javascript的语句、对象笔记摘要

    表达式语句 greeting ="Hello"+name;//赋值语句 i*=3; count++; delete o.x; //删除 alert(greeting); //函数 ...