本系列博客结合我的理解,对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的更多相关文章

  1. spring源码浅析——IOC

    =========================================== 原文链接: spring源码浅析--IOC   转载请注明出处! ======================= ...

  2. spring源码分析---IOC(1)

    我们都知道spring有2个最重要的概念,IOC(控制反转)和AOP(依赖注入).今天我就分享一下spring源码的IOC. IOC的定义:直观的来说,就是由spring来负责控制对象的生命周期和对象 ...

  3. Spring源码解析-ioc容器的设计

    Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...

  4. Spring 源码剖析IOC容器(一)概览

    目录 一.容器概述 二.核心类源码解读 三.模拟容器获取Bean ======================= 一.容器概述 spring IOC控制反转,又称为DI依赖注入:大体是先初始化bean ...

  5. Spring源码解读之BeanFactoryPostProcessor的处理

    前言 前段时间旁听了某课堂两节Spring源码解析课,刚好最近自己又在重新学习中,便在这里记录一下学习所得.我之前写过一篇博文,是介绍BeanFactoryPostProcessor跟BeanPost ...

  6. Spring源码解读--(一)源码下载

    走在Java程序员这条路上,网上Java各种工具满天飞,写个简单的CRUD,相信是个开发都能写出来,于是在思考如何可以在同行业中更有竞争力(其实就是如何赚更多钱).那么,老大给我推荐了Spring源码 ...

  7. Spring源码 05 IOC 注解方式

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

  8. Spring源码 18 IOC refresh方法13

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

  9. Spring源码 16 IOC refresh方法11

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

随机推荐

  1. Netty 中的消息解析和编解码器

    本篇内容主要梳理一下 Netty 中编解码器的逻辑和编解码器在 Netty 整个链路中的位置. 前面我们在分析 ChannelPipeline 的时候说到入站和出站事件的处理都在 pipeline 中 ...

  2. poj3177 无向连通图加多少条边变成边双连通图

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15752   Accepted: 6609 ...

  3. Linux centos 7 目录结构

    一.目录结构与用途: /boot:系统引导文件.内核 /bin:用户的基本命令 /dev:设备文件 /etc:配置文件 /home:用户目录 /root:root用户目录 /sbin:管理类的基本命令 ...

  4. 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 ...

  5. vue项目中使用bpmn-番外篇(留言问题总结)

    前情提要 “vue项目中使用bpmn-xxxx”系列的七篇文章在上周已经更新完成,发表后,有小伙伴在使用时提出了一些文章中没有讲到的问题,此篇作为番外篇,将大家提出的共性问题解答一下,欢迎大家支持原创 ...

  6. SpringMVC入门总结

    一.SpringMVC的好处? 1,基于注解,stuts2虽然也有注解但是比较慢,没人用更多的时候是用xml的形式 2,能与spring其它技术整合比如说webflow等, 3,获取request及s ...

  7. Docker容器启动时初始化Mysql数据库

    1. 前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案 ...

  8. [C#打包部署教程]002.VS2012 + Dotfuscator

    前言: C#程序界流传着一句古话:"成也Reflector,败也Reflector!" C#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一 ...

  9. This的关键字的使用

    this: 1.可以用来修饰属性  方法 构造器 2.this理解为当前对象或当前正在创建的对象. 3.可以在构造器中通过this()形参的方式显示的调用本类中其他重载的指定的构造器 要求: 在构造器 ...

  10. 值得注意的Java基础知识

    1)Java语言中默认(即缺省没写出)的访问权限,不同包中的子类不能访问. 中有4中访问修饰符:friendly(默认).private.public和protected. public :能被所有的 ...