SpringIOC源码解析(下)
注意,看完这篇文章需要很长很长很长时间。。。
本篇文章是SpringIOC源码解析(上)的续集,上一篇文章介绍了使用XML的方式启动Spring,然后追踪了BeanFactory容器的创建、配置文件的解析、Bean的注册等。
12. finishBeanFactoryInitialization()
前方超长篇幅预警。。。
刚才我们提到了bean还没有初始化。这个方法就是负责初始化所有的没有设置懒加载的singleton bean
开始撸了
1 |
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
|
上方没有解释的代码意义往下看吧
conversionService
这种类型的bean最实用的场景就是用来将前端传过来的参数和后端的controller方法上的参数格式转换的时候使用
例如:前端要传一个String,后端使用Date接受的时候就可以这样操作
1 |
|
再搞个bean
1 |
<bean id="conversionService" |
EmbeddedValueResolver
利用EmbeddedValueResolver可以很方便的实现读取配置文件的属性
1 |
@Component |
初始化
敲黑板了,重点来了。。。
这里分析beanFactory.preInstantiateSingletons()方法
1 |
public void preInstantiateSingletons() throws BeansException {
|
可以看到,不管是不是FactoryBean,最后都调用了getBean(beanName),继续看这个方法吧
1 |
@Override |
看了上方方法我们知道了原来Spring本身只定义了两种Scope,也知道了SpringMVC的几种Scope是如何实现的了。
然后发现一开始会先判断bean存不存在,如果存在就直接返回了。如果不存在那就要接着往下看createBean方法了
1 |
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
|
到这里第一次初始化的bean也返回了,你以为就这样结束了么。不,还有几个很重要的点
创建bean实例createBeanInstance ()
1 |
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
|
选一个无参的构造看一下吧
1 |
protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
|
bean属性注入populateBean ()
1 |
protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
|
getBean这一块就搞完了
13. finishRefresh()
1 |
protected void finishRefresh() {
|
14. resetCommonCaches()
最后还是一步还是清除缓存
15. refresh()总结
上方用了这么长的篇幅把整个refresh()方法的细节给梳理清楚,这里再把刚开始看的懵懵的refresh()方法贴一下
1 |
|
总结
至此,本文到此结束。鉴于XML方式比较简单、通俗易懂,所以本文基于XML的方式大致介绍了SpringIOC的启动流程、稍微深入的讲解了Bean容器的创建以及Bean的初始化过程。这也是作者第一次阅读开源框架的源码,如文章有错误之处还请您费心指出。
鉴于现在比较流行SpringBoot和SpringCloud,下篇文章将会从基于注解的方向分析SpringIOC
SpringIOC源码解析(下)的更多相关文章
- springIOC源码解析之BeanDefinition的注册
ApplicationContext类结构 context是一个存储上下文结构的东西,里面会引用BeanFactory BeanFactory类结构 我们从这句代码开始分析,(本文spring采用的 ...
- SpringIOC源码解析(上)
注意,看完这篇文章需要很长很长很长时间... 准备工作 本文会分析Spring的IOC模块的整体流程,分析过程需要使用一个简单的demo工程来启动Spring,demo工程我以备好,需要的童鞋自行在下 ...
- Laravel学习笔记之Session源码解析(下)
说明:在中篇中学习了session的CRUD增删改查操作,本篇主要学习关闭session的相关源码.实际上,在Laravel5.3中关闭session主要包括两个过程:保存当前URL到session介 ...
- springIOC源码解析之Bean的创建
上一篇讲到了beanFactory的配置文件的解析和beanFactory的创建,都集中到了obtainFreshBeanFactory();这一句代码里了,本篇主要讲bean的创建过程 public ...
- axios 源码解析(下) 拦截器的详解
axios的除了初始化配置外,其它有用的应该就是拦截器了,拦截器分为请求拦截器和响应拦截器两种: 请求拦截器 ;在请求发送前进行一些操作,例如在每个请求体里加上token,统一做了处理如果以后要 ...
- Spring源码解析系列汇总
相信我,你会收藏这篇文章的 本篇文章是这段时间撸出来的Spring源码解析系列文章的汇总,总共包含以下专题.喜欢的同学可以收藏起来以备不时之需 SpringIOC源码解析(上) 本篇文章搭建了IOC源 ...
- erlang下lists模块sort(排序)方法源码解析(二)
上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...
- erlang下lists模块sort(排序)方法源码解析(一)
排序算法一直是各种语言最简单也是最复杂的算法,例如十大经典排序算法(动图演示)里面讲的那样 第一次看lists的sort方法的时候,蒙了,几百行的代码,我心想要这么复杂么(因为C语言的冒泡排序我记得不 ...
- 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(下)
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/12/es-code03/ 前提 上篇文章写完了 ES 流程启动的一部分,main 方法都入 ...
随机推荐
- appium---app输入中文
在app自动化的过程中,都会遇到输入中文的问题,今天总结下app自动化如何输入中文 app输入中文 在启动app的时候在参数里面添加unicodeKeyboard和resetKeyboard后,运行代 ...
- Dmidecode命令
Dmidecode简介 DMI (Desktop Management Interface, DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行. ...
- 子进程回收资源两种方式,僵尸进程与孤儿进程,守护进程,进程间数据隔离,进程互斥锁,队列,IPC机制,线程,守护线程,线程池,回调函数add_done_callback,TCP服务端实现并发
子进程回收资源两种方式 - 1) join让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源. - 2) 主进程 “正常结束” ,子进程与主进程一并被回收资源. from multipr ...
- OpenStack Nova
OpenStack Nova 简介 OpenStack 中的 Nova 负责维护和管理云环境的计算资源 Nova 在现有 Linux 服务器上作为一组守护线程来提供服务 Nova 由多个服务器进程组成 ...
- Python进阶-XIII 导入模块和包 异常处理
一.模块的导入 1).import # 测试一:money与my_module.money不冲突 import my_module money=10 print(my_module.money) '' ...
- Maven的Scope区别笔记
依赖的Scopescope定义了类包在项目的使用阶段.项目阶段包括: 编译,运行,测试和发布. 分类说明compile 默认scope为compile,表示为当前依赖参与项目的编译.测试和运行阶段,属 ...
- 【洛谷1829】 [国家集训队] Crash的数字表格(重拾莫比乌斯反演)
点此看题面 大致题意: 求\(\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\). 推式子 不会莫比乌斯反演的可以先去看这篇博客:初学莫比乌斯反演. 反演题显然就是推式子啊~~~ 考 ...
- [LeetCode] 719. Find K-th Smallest Pair Distance 找第K小的数对儿距离
Given an integer array, return the k-th smallest distance among all the pairs. The distance of a pai ...
- IDEA 2019注册码(2020年4月过期)
IDEA 2019注册码(2020年4月过期) 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mII ...
- Docker私有云管理平台————Docker Shipyard
一.shipyard中文版安装(CentOS) 注:本文安装操作均在root用户下,安装前需先安装Docker (传送门) 下载所需docker镜像 docker pull rethinkdb doc ...