spring源码解读-ioc
本系列博客结合我的理解,对spring的ioc进行简单分析,欢迎大家批评指正。
beanfactory
我们从beanfactory开始,beanfactory是最根部的容器,描述了整个ioc的一些规范和原则,也就是这个接口定义了ioc容器的最基本的条件,下面列出了整个接口中的方法

对于这些方法都可以根据方法名了解它的作用,我们这里需要说一下的是它定义的成员变量“&”
FactoryBean
factorybean本身也是存活于beanfactory中的,本身也是一个工厂也是一个bean,用于创建factorybean所能创建出来的对象,在创建出对象的时候可在对象的方法前或后执行一些额外的方法如AOP,这里我们就要用到&,如果我们写getBean(“user”),我们拿到的是user的factorybean创建出来的user对象,如果我们写getBean(“&user”)我们拿到的是user的factorybean。
defaultlistablebeanfacotry
这个类非常重要,spring加载资源并装配对象的主要过程都发生在这个类中,当然调用了其他的类来完成功能,可以说主逻辑都是写在这个类中的
ClassPathResource resource = new ClassPathResource("beans.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);
spring加载资源并装配对象的过程如下:
1、定义好spring的配置文件
2、通过Resource对象将spring配置文件抽象,抽象成一个Resource对象
3、定义好bean工厂
4、定义好XmlBeanDefinitionReader对象,并将工厂作为参数传递进去后供后续回调使用
5、通过XmlBeanDefinitonReader对象读取之前抽象出的Resource对象(包含了XML文件的解析过程)
6、Ioc容器创建完毕,用户可以通过容器获取所需要的对象信息
这里我们重点要了解的是:
1、XML文件的解析是由XmlBeanDefinitionReader对象交由BeanDefinitionParserDelegate委托来完成的,实质上这里用到了委托模式
2、在DefaultBeanDefinitionDocumentReader类中的doRegisterBeanDefinitions方法中使用了经典的模板方法设计模式,子类可以重写preProcessXml与postProcessXml方法,以此来实现对XML文件的自定义扩展
factory.getBean()
用户获取对象信息的时候又会发生哪些过程呢?、
1、spring的bean实际上是缓存在CurrentHashMap对象中的
2、在创建Bean之前,首先应该将该bean的创建标志设定好,表示该bean已经或是即将被创建,为的是增强缓存的效率
3、根据bean的scope属性来确定singletion还是prototype等范围,然后创建相应的对象
4、通过java反射来创建bean的实例,在创建之前首先检查访问修饰符,如果该类的构造不是public的,则调用setAccessible(true)来突破java的语法限制,使的可以通过私有构造方法来创建对象实例
5、接下来,寻找bean的属性值,完成属性的注入
6、将所创建出的singleton对象添加到缓存中,供下次调用使用(scope为prototype则不缓存)
下图是ioc初始化的整个过程:

大家可参考上图断点调试,对整个过程进行跟踪。
spring源码解读-ioc的更多相关文章
- spring源码浅析——IOC
=========================================== 原文链接: spring源码浅析--IOC 转载请注明出处! ======================= ...
- spring源码分析---IOC(1)
我们都知道spring有2个最重要的概念,IOC(控制反转)和AOP(依赖注入).今天我就分享一下spring源码的IOC. IOC的定义:直观的来说,就是由spring来负责控制对象的生命周期和对象 ...
- Spring源码解析-ioc容器的设计
Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...
- Spring 源码剖析IOC容器(一)概览
目录 一.容器概述 二.核心类源码解读 三.模拟容器获取Bean ======================= 一.容器概述 spring IOC控制反转,又称为DI依赖注入:大体是先初始化bean ...
- Spring源码解读之BeanFactoryPostProcessor的处理
前言 前段时间旁听了某课堂两节Spring源码解析课,刚好最近自己又在重新学习中,便在这里记录一下学习所得.我之前写过一篇博文,是介绍BeanFactoryPostProcessor跟BeanPost ...
- Spring源码解读--(一)源码下载
走在Java程序员这条路上,网上Java各种工具满天飞,写个简单的CRUD,相信是个开发都能写出来,于是在思考如何可以在同行业中更有竞争力(其实就是如何赚更多钱).那么,老大给我推荐了Spring源码 ...
- Spring源码 05 IOC 注解方式
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- Spring源码 18 IOC refresh方法13
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- Spring源码 16 IOC refresh方法11
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
随机推荐
- Netty 中的消息解析和编解码器
本篇内容主要梳理一下 Netty 中编解码器的逻辑和编解码器在 Netty 整个链路中的位置. 前面我们在分析 ChannelPipeline 的时候说到入站和出站事件的处理都在 pipeline 中 ...
- poj3177 无向连通图加多少条边变成边双连通图
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15752 Accepted: 6609 ...
- Linux centos 7 目录结构
一.目录结构与用途: /boot:系统引导文件.内核 /bin:用户的基本命令 /dev:设备文件 /etc:配置文件 /home:用户目录 /root:root用户目录 /sbin:管理类的基本命令 ...
- vue npm run dev报错webpack-dev-server
在运行vue项目时报如下问题: E:\mobile_real\mobile-vue>npm run dev > mobile_real@1.0.0 dev E:\mobile_real\m ...
- vue项目中使用bpmn-番外篇(留言问题总结)
前情提要 “vue项目中使用bpmn-xxxx”系列的七篇文章在上周已经更新完成,发表后,有小伙伴在使用时提出了一些文章中没有讲到的问题,此篇作为番外篇,将大家提出的共性问题解答一下,欢迎大家支持原创 ...
- SpringMVC入门总结
一.SpringMVC的好处? 1,基于注解,stuts2虽然也有注解但是比较慢,没人用更多的时候是用xml的形式 2,能与spring其它技术整合比如说webflow等, 3,获取request及s ...
- Docker容器启动时初始化Mysql数据库
1. 前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案 ...
- [C#打包部署教程]002.VS2012 + Dotfuscator
前言: C#程序界流传着一句古话:"成也Reflector,败也Reflector!" C#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一 ...
- This的关键字的使用
this: 1.可以用来修饰属性 方法 构造器 2.this理解为当前对象或当前正在创建的对象. 3.可以在构造器中通过this()形参的方式显示的调用本类中其他重载的指定的构造器 要求: 在构造器 ...
- 值得注意的Java基础知识
1)Java语言中默认(即缺省没写出)的访问权限,不同包中的子类不能访问. 中有4中访问修饰符:friendly(默认).private.public和protected. public :能被所有的 ...