SpringIoC

是什么?

​ 官方文档的解释是:IoC也称为依赖注入(DI)。在此过程中,对象仅通过构造函数参数,工厂方法的参数或在构造或从工厂方法返回后在对象实例上设置的属性来定义其依赖项(即,与它们一起使用的其他对象) 。然后,容器在创建bean时注入那些依赖项。从本质上讲,此过程是通过使用类的直接构造或诸如服务定位器模式之类的机制来控制其依赖关系的实例化或位置的Bean本身的逆过程(因此,其名称为Control Inversion)。

​ 简单来说:就是我们将一个个的bean对象交给IoC去管理,他会帮助我们去创建对象实例、填充属性、初始化、添加监听器等过程。

类图

​ 我们以常用的ClassPathXmlApplicationContext为例

大致过程

​ 首先,一个IoC容器应创建一个工厂(DefaultListableBeanFactory),可以使我们读取的资源文件可以存放。

​ 然后,将配置文件通过一个规范(BeanDefinitionReader)加载出来。

​ 接着,是bean对象实例化之前的一些准备(初始化啊、事件处理器、注册组件等);例如上图中的BeanFactoryPostProcessor、多播器等。

​ 重要的地方来了,创建一个个的非懒加载的成品Bean对象(finishBeanFactoryInitialization方法)。

​ 最后,是一些事件的发布、缓存、销毁等。

源码分析

​ 从ClassPathXmlApplicationContext开始分析。在它的构造方法中,我们可以看见调用了父类(AbstractApplicationContext类)的构造方法、设置配置文件的加载路径以及核心方法refresh()方法。

​ 父类AbstractApplicationContext的构造方法

​ setConfigLocations()方法

​ 接下来,我们进入核心方法refresh()

​ 我们重点看序号2和序号11,其他有兴趣可以自己点进去看看。

​ obtainFreshBeanFactory()方法

​ 跟进refreshBeanFactory()方法,在AbstractRefreshableApplicationContext类中可以找到refreshBeanFactory()这个方法

​ createBeanFactory()方法中

​ loadBeanDefinitions()方法,也是委派给子类去实现。

​ 我们进去子类AbstractXmlApplicationContext类的loadBeanDefinition()方法。在这里进行了配置文件读取规范的定义,我们继续跟进loadBeanDefinitions()方法。

​ loadBeanDefinitions()方法。传入的可能是个String[]或者Resource[]类型。但是大致流程都差不多:String[]->String->Resource[]->Resource->Document->BeanDefinition。这里就不过多深入了,感兴趣可以照这个流程看下去。

​ 资源文件加载完成后,我们的BeanFactory差不多就创建好了。接着,我们到IoC最重要的过程,Bean对象(不是懒加载的)的实例化和初始化。这里为什么将实例化和初始化分开说呢,是想更好的帮助理解Bean对象的创建过程。其实Spring中更加的细分了一下,分成了实例化(createBeanInstance()方法)、填充属性(populateBean()方法)和初始化(initializeBean()方法)。

实例化:在堆中开辟了一块空间。属性都是系统默认值。

初始化:给属性完成具体的赋值操作,调用具体的初始化方法。

​ 好了,我们进入finishBeanFactoryInitialization()方法,里面你会看到一些对beanFactory的属性设置,其中重点的是preInstantiateSingletons()方,点进去,它会调用DefaultListableBeanFactory的preInstantiateSingletons()方法。

​ 我们可以看到getBean()方法,这里就是准备开始进行bean对象的创建了。点进去,我们可以看真正执行的是doGetBean()方法

​ doGetBean()方法,就是根据不同的Bean采用不同的创建策略。

1. 如果Bean是单例的,则在容器创建之前先从缓存中查找,确保整个容器只存在一个实例对象

2. 如果Bean是原型模式的,则容器每次都会创建一个新的实例对象

3. 指定了Bean的生命周期

​ 我们进入createBean(),发现还有一个doCreateBean方法(),终于,我们到了真正创建Bean对象的方法。点进去。

​ 我们发现我们终于找到了之前所说的那三个方法了,创建、填充和初始化。

​ createBeanInstance()方法返回的是一个BeanWrapper,bean的封装类。

​ populateBean()则是将bean的一些属性字段进行解析、填充。

​ 在initializeBean()中

​ 到此,我们一开始的流程图所有的地方差不多都完成了。其中有些细节方面没点进去看看,主要是大致了解IoC的过程。可以自行debug进去看看。

【Spring】SpringIoC大致流程的更多相关文章

  1. Spring源码剖析1:初探Spring IOC核心流程

    本文大致地介绍了IOC容器的初始化过程,只列出了比较重要的过程和代码,可以从中看出IOC容器执行的大致流程. 接下来的文章会更加深入剖析Bean容器如何解析xml,注册和初始化bean,以及如何获取b ...

  2. Spring源码剖析2:初探Spring IOC核心流程

    本文转载自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutor ...

  3. [每日电路图] 7、设计一个PCB的流程及细节·总结——给外行的同学或刚入行的同学一个宏观鸟瞰电路板设计的大致流程的文章

    前言 最近两天使用AD14软件设计了一个蓝牙防丢器电路板(PCB)图纸,中间有一些细节在本文中记录下,方便下次设计PCB时参考.也希望能给外行的同学或刚入行的同学一个宏观鸟瞰电路板设计的大致流程的文章 ...

  4. 参与github上开源项目的大致流程和注意事项

    Foreword github是一个很火的代码托管服务网站,可能好多人都想参与一两个项目玩一玩学习一下,但由于是纯英文的网站,可能又会止步于想法上没有动手实践.接下来我就介绍一下参与github上开源 ...

  5. 记录archlinux中安装pcl的大致流程

    贴一下pcl在github上的网址: https://github.com/PointCloudLibrary/pcl/ 从这个网址出发,一般能找到安装的 tutorial.以下只说一下在archli ...

  6. 【原创】storyboard启动应用程序的大致流程

    storyboard启动应用程序的大致流程 [原创] 转载请注明出处:http://i.cnblogs.com/EditPosts.aspx?postid=5395023 1. 用户点击APP图标—— ...

  7. spring mvc处理流程概述

    大部分Java应用都是Web应用,展现层是Web应用不可忽略的重要环节.Spring为展现层提供了一个优秀的Web框架-Spring MVC.和众多其他Web框架一样,它基于MVC设计理念,此外,它采 ...

  8. Unity3D|-XLua热更新用法的大致流程

    xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档 官网:https://github.com/Tencent/xLua 配置文档:https://gith ...

  9. Spring MVC 编程流程步骤

    Spring MVC 编程流程步骤 1. 建立Maven工程 2. 添加Spring MVC依赖 <dependencies> <dependency> <groupId ...

随机推荐

  1. Vue(1)

    一:概述 Vue是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用.Vue的核心库只关心视图层,不仅易于上手,还便于与第三方库或既有项目 ...

  2. 字符串拼接出现null的问题

    最近在开发的过程中遇到这样的问题,原因是在做一个需求的时候,要求将解密的号码和前缀进行拼接.一开始在这个拼接的过程中,没有考虑到数据校验的问题,因为有可能他的前缀或者其他需要拼接的字段在前端传递的过程 ...

  3. 卧槽,好强大的魔法,竟能让Python支持方法重载

    1. 你真的了解方法重载吗? 方法重载是面向对象中一个非常重要的概念,在类中包含了成员方法和构造方法.如果类中存在多个同名,且参数(个数和类型)不同的成员方法或构造方法,那么这些成员方法或构造方法就被 ...

  4. JavaScript async/await:优点、陷阱及如何使用

    翻译练习 原博客地址:JavaScript async/await: The Good Part, Pitfalls and How to Use ES7中引进的async/await是对JavaSc ...

  5. linux 关闭对端口的监听

    netstat -anp | grep [端口号] [root@test-01 ~]# netstat -anp | grep 6665 tcp 0 0 0.0.0.0:6665 0.0.0.0:* ...

  6. java list集合遍历时删除元素

    转: java list集合遍历时删除元素 大家可能都遇到过,在vector或arraylist的迭代遍历过程中同时进行修改,会抛出异常java.util.ConcurrentModification ...

  7. Hi3559板载u-boot、kernel及rootfs烧录过程及心得

    这一篇随笔讲叙述下基于Hi3559AV100的BOXER-8410AI板载u-boot.kernel及rootfs烧录具体过程及遇到问题的解决方法与心得. 1.前期板载启动测试和烧录手段 1.1.烧写 ...

  8. PAT-1064(Complete Binary Search Tree)JAVA实现

    Complete Binary Search Tree PAT-1064 本次因为涉及到完全二叉排序树,所以可以使用数组的形式来存储二叉排序树 对输入序列排序后,得到的是中序遍历二叉排序树的序列.对这 ...

  9. vs2019远程调试

    VS2019远程调试 这几天遇到个很是纠结的问题,同样的源代码,放在测试服务器,完美运行.但是上线正式环境就是死活显示不出来.于是想到了微软的远程调试功能,这里用VS2019举例. 下载远程访问工具 ...

  10. Picgo + Gitee +Typora(自动上传)搭建markdown免费图库

    Picgo + Gitee +Typora(自动上传)搭建markdown免费图库 前言: ​ 在写博客的是时候,之前那都是直接在博客网站上面写好了,再一一插入图片,当要在同时2个以上的博客上面发表的 ...