【Spring】SpringIoC大致流程
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大致流程的更多相关文章
- Spring源码剖析1:初探Spring IOC核心流程
本文大致地介绍了IOC容器的初始化过程,只列出了比较重要的过程和代码,可以从中看出IOC容器执行的大致流程. 接下来的文章会更加深入剖析Bean容器如何解析xml,注册和初始化bean,以及如何获取b ...
- Spring源码剖析2:初探Spring IOC核心流程
本文转载自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutor ...
- [每日电路图] 7、设计一个PCB的流程及细节·总结——给外行的同学或刚入行的同学一个宏观鸟瞰电路板设计的大致流程的文章
前言 最近两天使用AD14软件设计了一个蓝牙防丢器电路板(PCB)图纸,中间有一些细节在本文中记录下,方便下次设计PCB时参考.也希望能给外行的同学或刚入行的同学一个宏观鸟瞰电路板设计的大致流程的文章 ...
- 参与github上开源项目的大致流程和注意事项
Foreword github是一个很火的代码托管服务网站,可能好多人都想参与一两个项目玩一玩学习一下,但由于是纯英文的网站,可能又会止步于想法上没有动手实践.接下来我就介绍一下参与github上开源 ...
- 记录archlinux中安装pcl的大致流程
贴一下pcl在github上的网址: https://github.com/PointCloudLibrary/pcl/ 从这个网址出发,一般能找到安装的 tutorial.以下只说一下在archli ...
- 【原创】storyboard启动应用程序的大致流程
storyboard启动应用程序的大致流程 [原创] 转载请注明出处:http://i.cnblogs.com/EditPosts.aspx?postid=5395023 1. 用户点击APP图标—— ...
- spring mvc处理流程概述
大部分Java应用都是Web应用,展现层是Web应用不可忽略的重要环节.Spring为展现层提供了一个优秀的Web框架-Spring MVC.和众多其他Web框架一样,它基于MVC设计理念,此外,它采 ...
- Unity3D|-XLua热更新用法的大致流程
xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档 官网:https://github.com/Tencent/xLua 配置文档:https://gith ...
- Spring MVC 编程流程步骤
Spring MVC 编程流程步骤 1. 建立Maven工程 2. 添加Spring MVC依赖 <dependencies> <dependency> <groupId ...
随机推荐
- Java流程控制:选择结构
一.选择结构 选择结构用于判断给定的条件,根据判断的结果来控制程序的流程. Java中选择结构的语法主要分为'if...else'语句和'switch...case'语句. Java中选择结构语句在语 ...
- 40. 组合总和 II + 递归 + 回溯 + 记录路径
40. 组合总和 II LeetCode_40 题目描述 题解分析 此题和 39. 组合总和 + 递归 + 回溯 + 存储路径很像,只不过题目修改了一下. 题解的关键是首先将候选数组进行排序,然后记录 ...
- WPF 基础 - Trigger
1. Trigger 1.1 由属性值触发的 Trigger 最基本的触发器,Property 是关注的属性名称,value 是触发条件,一旦触发条件满足,就会应用 Trigger 的 Setters ...
- Java 在PPT中添加文本水印的简易方法(单一/平铺水印)
[前言] 在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即在幻灯片中心位置水印以单个文本字样显示,但通过一定方法也可以添加多行(平铺)文本水印效果,即在幻灯片中 ...
- 【python+selenium的web自动化】- 针对上传操作的实现方案
如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html 关于上传操作 上传有两 ...
- P1308_统计单词数(JAVA语言)
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- Android Studio 之 TextView基础
•引言 在开始本节内容前,先要介绍下几个单位: dp(dip) : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关 一般我们为了支持 ...
- go每日一库 [home-dir] 获取用户主目录
关于我 我的博客|文章首发 顾名思义,go-homedir用来获取用户的主目录.实际上,通过使用标准库os/user我们也可以得到内容,使用以下方式 标准库使用 package main import ...
- 每天自学两小时Python,整理了最详细的学习路线和规
上次这篇文章每天自学两小时Python,三个月学通月入20K主要是给大家整理了学习资料视频和PDF书籍,很多需要的都关注私信领取了. 很多朋友领取之后都问我教程有了那么应该从哪去开始学习呢,私信太多我 ...
- 从网络请求过程看OkHttp拦截器
前言 之前我们结合设计模式简单说了下OkHttp的大体流程,今天就继续说说它的核心部分--拦截器. 因为拦截器组成的链其实是完成了网络通信的整个流程,所以我们今天就从这个角度说说各拦截器的功能. 首先 ...