IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring注解驱动开发学习总结21:Spring容器创建 - 创建bean的详细步骤 -> 正文阅读

[Java知识库]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);

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:15:04  更:2022-04-24 09:16:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:01:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码