Spring注解驱动开发学习总结21:Spring容器创建 - 创建bean的详细步骤

回顾前3篇文章:
1、Spring注解驱动开发学习总结18:Spring容器创建 - beanFactory创建和预准备工作步骤
分析了Spring容器refresh方法的:
1)刷新前的容器准备:prepareRefresh();
2)刷新内置的bean工厂:obtainFreshBeanFactory();
3)bean工厂的预处理工作:prepareBeanFactory(beanFactory);
4)bean工厂创建并预备好以后的后置处理工作:postProcessBeanFactory(beanFactory);

2、Spring注解驱动开发学习总结19:Spring容器创建 - beanFactory后置处理器的操作步骤
分析了Spring容器refresh方法的:
5)执行beanFactory的后置处理器工作:
invokeBeanFactoryPostProcessors(beanFactory)

3、Spring注解驱动开发学习总结20:Spring容器创建 - 注册bean后置处理器、初始化事件派发器、注册监听器
分析了Spring容器refresh方法的:
6)注册bean后置处理器:registerBeanPostProcessors(beanFactory)
7)初始化MessageSource组件(国际化功能、消息绑定):initMessageSource();
8)初始化事件派发器:initApplicationEventMulticaster();
9)容器刷新方法:onRefresh();
10)注册监听器:registerListeners();

本文接着分析refresh方法
11、创建剩下的单实例bean:finishBeanFactoryInitialization(beanFactory)
12、完成刷新方法:finishRefresh()
在这里插入图片描述

1、分析11步中的finishBeanFactoryInitialization方法

在867行,会先调用beanFactory.preInstantiateSingletons()方法来创建剩下的非懒加载的bean实例
分析preInstantiateSingletons方法
11.1 在735行,先获取容器中所有定义的bean名称
11.2 在729-741行,先获取bean的定义信息:RootBeanDefinition。如果该bean不是抽象的,是单
  实例的,不是懒加载的话,再判断是否是FactoryBean。
  如果是FactoryBean,在742行:factory = getBean(FACTORY_BEAN_PREFIX + beanName);
  如果不是FactoryBean,在761行:getBean(beanName)
  接下来分析如果不是FactoryBean的情况:getBean方法先调用doGetBean(name)方法
11.3 在781行,在bean创建完成后,依次判断bean是否实现了SmartInitializingSingleton接口,如果
  是,就执行它的afterSingletonsInstantiated方法
在这里插入图片描述
在这里插入图片描述

分析11.2中的doGetBean方法

11.2 如果不是FactoryBean的情况:getBean方法先调用doGetBean(name)方法
  分析doGetBean方法
  11.2.1 在243-244行,先尝试从缓存中获取bean:getSingleton(beanName)。
     在getSingleton方法的185行,会从singletonObjects中获取该bean。
     在DefaultSingletonBeanRegistry类的86行,可以得到singletonObjects的定义:
     Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>
     (256);
     如果从缓存中获取不到,那么只能自己创建了
  11.2.2 在288-296行,先获取当前bean所依赖的bean的信息,如果有的话,需要先把依赖的 
     bean给创建出来:getBean(dep);
  11.2.3 在302,306行,创建单实例bean:createBean(beanName, mbd, args);
     
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面4张图是11.2.1中关联的图。
在这里插入图片描述
上面1张图是11.2.2和11,2,3中关联的图。

分析11.2.3中的createBean方法

11.2.3 在302,306行,创建单实例bean:createBean(beanName, mbd, args);
  分析createBean方法
  11.2.3.1 在472-473行,给后置处理器一个机会来返回该bean的代理对象:
     resolveBeforeInstantiation。
     分析resolveBeforeInstantiation方法,在1011-1014行,
     先调用后置处理器的beanPostProcessorsBeforeInstantiation方法,
     如果有返回值,再调用后置处理器的beanPostProcessorsAfterInitialization方法
  11.2.3.2 如果上一步没有返回代理对象,在483行,调用doCreateBean方法创建bean
  
在这里插入图片描述
在这里插入图片描述

分析11.2.3.2中的doCreateBean方法

11.2.3.2 如果上一步没有返回代理对象,在483行,调用doCreateBean方法创建bean
  11.2.3.2.1 在513行,调用createBeanInstance方法,利用工厂方法或者对象的构造器通过反射 
     创建出bean实例。
  11.2.3.2.2 在523行,调用applyMergedBeanDefinitionPostProcessors方法。
     在该方法的990-993行中,会执行所有后置处理器为
     MergedBeanDefinitionPostProcessor类型的postProcessMergedBeanDefinition方法
  11.2.3.2.3 在553行,调用populateBean方法给bean属性赋值,接着分析populateBean方法
     1)在1223-1228行,执行所有类型为InstantiationAwareBeanPostProcessor的后置处
       理器的postProcessAfterInstantiation方法
     2)在1261-1266行,执行所有类型为InstantiationAwareBeanPostProcessor的后置处
       理器的postProcessPropertyValues方法
     3)在1276行,为bean属性利用setter方法进行赋值:applyPropertyValues
  11.2.3.2.4 在555行,调用initializeBean方法初始化bean,接着分析initializeBean方法
     1)在1615行,执行Aware接口的回调方法:invokeAwareMethods
       回调的接口类型有:BeanNameAware、BeanClassLoaderAware、
                BeanFactoryAware
     2)在1620行,执行初始化之前的后置处理器操作:
       applyBeanPostProcessorsBeforeInitialization
       遍历所有后置处理器beanProcessor,执行以下操作
       beanProcessor.postProcessBeforeInitialization(result, beanName);
     3)在1624行,执行初始化方法:invokeInitMethods
       在该方法中调用初始化方法
     4)在1633行,执行初始化之后的后置处理器操作:
       applyBeanPostProcessorsAfterInitialization
       遍历所有后置处理器beanProcessor,执行以下操作
       beanProcessor.postProcessAfterInitialization(result, beanName);
 11.2.3.2.5 在597行,注册bean的销毁方法:registerDisposableBeanIfNecessary
在这里插入图片描述
在这里插入图片描述
上面2张图是与11.2.3.2.1-11.2.3.2.2相关的图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面3张图是与11.2.3.2.3相关的图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面5张图是与11.2.3.2.4相关的图
在这里插入图片描述
上面1张图是与11.2.3.2.5相关的图

2、分析12步中的finishBeanFactoryInitialization方法

12、完成刷新方法:finishRefresh()
  12.1 在877行,初始化生命周期相关的处理器:initLifecycleProcessor
    分析initLifecycleProcessor方法
    在772-774,780-783行,判断beanFactory中是否有id为lifecycleProcessor类型为
    LifecycleProcessor的处理器。如果没有的话:
    则创建一个默认的处理器并加入到容器中:new DefaultLifecycleProcessor
  12.1 在880行,拿前面定义的生命周期处理器回调onRefresh方法:
    getLifecycleProcessor().onRefresh()
  12.1 在883行,发布容器刷新完成的事件:publishEvent(new ContextRefreshedEvent(this))
  12.1 在886行,:LiveBeansView.registerApplicationContext(this);
在这里插入图片描述
在这里插入图片描述

3、小结

前面3篇文章分析了refresh方法1-10的步骤,本文分析了refresh方法中的第11-12步。

尤其是重点分析了11步中的创建bean的基本流程步骤,里面部分和之前AOP原理分析的代码是一致的,并且是想贯通的。但是本文没有具体分析循环导入、依赖导入的详细分析,只是大致列出了基本的bean实例的大致步骤

1、刷新前的容器准备:prepareRefresh();
2、刷新内置的bean工厂:obtainFreshBeanFactory();
3、bean工厂的预处理工作:prepareBeanFactory(beanFactory);
4、bean工厂创建并预备好以后的后置处理工作:postProcessBeanFactory(beanFactory);
5、执行beanFactory的后置处理器工作:
invokeBeanFactoryPostProcessors(beanFactory)
6、注册bean后置处理器:registerBeanPostProcessors(beanFactory)
7、初始化MessageSource组件(国际化功能、消息绑定):initMessageSource();
8、初始化事件派发器:initApplicationEventMulticaster();
9、容器刷新方法:onRefresh();
10、注册监听器:registerListeners();
11、创建剩下的单实例bean:finishBeanFactoryInitialization(beanFactory)
  在867行,会先调用beanFactory.preInstantiateSingletons()方法来创建剩下的非懒加载的bean 
  实例。接下来继续分析preInstantiateSingletons方法
  11.1 在735行,先获取容器中所有定义的bean名称
  11.2 在729-741行,先获取bean的定义信息:RootBeanDefinition。如果该bean不是抽象的,
    是单实例的,不是懒加载的话,再判断是否是FactoryBean。
    如果是FactoryBean,在742行:
      factory = getBean(FACTORY_BEAN_PREFIX + beanName);
    如果不是FactoryBean,在761行:getBean(beanName)
    接下来分析如果不是FactoryBean的情况:getBean方法先调用doGetBean(name)方法
    11.2.1 在243-244行,先尝试从缓存中获取bean:getSingleton(beanName)。
       在getSingleton方法的185行,会从singletonObjects中获取该bean。
       在DefaultSingletonBeanRegistry类的86行,可以得到singletonObjects的定义:
       Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>
       (256);
       如果从缓存中获取不到,那么只能自己创建了
    11.2.2 在288-296行,先获取当前bean所依赖的bean的信息,如果有的话,需要先把依赖
       的bean给创建出来:getBean(dep);
    11.2.3 在302,306行,创建单实例bean:createBean(beanName, mbd, args);
      11.2.3.1 在472-473行,给后置处理器一个机会来返回该bean的代理对象:
         resolveBeforeInstantiation。
         分析resolveBeforeInstantiation方法,在1011-1014行,
         先调用后置处理器的beanPostProcessorsBeforeInstantiation方法,
         如果有返回值,再调用后置处理器的beanPostProcessorsAfterInitialization方法
      11.2.3.2 如果上一步没有返回代理对象,在483行,调用doCreateBean方法创建bean
         11.2.3.2.1 在513行,调用createBeanInstance方法,利用工厂方法或者对象的
            构造器通过反射创建出bean实例。
         11.2.3.2.2 在523行,调用applyMergedBeanDefinitionPostProcessors方法。
            在该方法的990-993行中,会执行所有后置处理器为
            MergedBeanDefinitionPostProcessor类型的
            postProcessMergedBeanDefinition方法
         11.2.3.2.3 在553行,调用populateBean方法给bean属性赋值,接着分析
            populateBean方法
            1)在1223-1228行,执行所有类型为
              InstantiationAwareBeanPostProcessor的后置处
              理器的postProcessAfterInstantiation方法
            2)在1261-1266行,执行所有类型为
              InstantiationAwareBeanPostProcessor的后置处
              理器的postProcessPropertyValues方法
            3)在1276行,为bean属性利用setter方法进行赋值:
              applyPropertyValues
        11.2.3.2.4 在555行,调用initializeBean方法初始化bean,接着分析initializeBean
           方法
           1)在1615行,执行Aware接口的回调方法:invokeAwareMethods
             回调的接口类型有:BeanNameAware、BeanClassLoaderAware、
                      BeanFactoryAware
           2)在1620行,执行初始化之前的后置处理器操作:
             applyBeanPostProcessorsBeforeInitialization
             遍历所有后置处理器beanProcessor,执行以下操作
             beanProcessor.postProcessBeforeInitialization(result, beanName);
           3)在1624行,执行初始化方法:invokeInitMethods
             在该方法中调用初始化方法
           4)在1633行,执行初始化之后的后置处理器操作:
             applyBeanPostProcessorsAfterInitialization
             遍历所有后置处理器beanProcessor,执行以下操作
             beanProcessor.postProcessAfterInitialization(result, beanName);
       11.2.3.2.5 在597行,注册bean的销毁方法:registerDisposableBeanIfNecessary
  11.3 在781行,在bean创建完成后,依次判断bean是否实现了SmartInitializingSingleton接口,
    如果是,就执行它的afterSingletonsInstantiated方法
12、完成刷新方法:finishRefresh()
  12.1 在877行,初始化生命周期相关的处理器:initLifecycleProcessor
    分析initLifecycleProcessor方法
    在772-774,780-783行,判断beanFactory中是否有id为lifecycleProcessor类型为
    LifecycleProcessor的处理器。如果没有的话:
    则创建一个默认的处理器并加入到容器中:new DefaultLifecycleProcessor
  12.1 在880行,拿前面定义的生命周期处理器回调onRefresh方法:
    getLifecycleProcessor().onRefresh()
  12.1 在883行,发布容器刷新完成的事件:publishEvent(new ContextRefreshedEvent(this))
  12.1 在886行,:LiveBeansView.registerApplicationContext(this);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值