本系列博客结合我的理解,对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. CSS3面试题

    1.隐藏网页中的元素有几种方式?这些方法有什么区别? 答案:三种方法. display:none;脱离文档流,不占页面空间,会改变页面布局. visivility:hidden;不会脱离文档流,不会改 ...

  2. 5.3 Go 匿名函数

    5.3 Go 匿名函数 Go支持匿名函数,顾名思义就是没名字的函数. 匿名函数一般用在,函数只运行一次,也可以多次调用. 匿名函数可以像普通变量一样被调用. 匿名函数由不带函数名字的函数声明与函数体组 ...

  3. 树形DP 2415HDU

    Bribing FIPA Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  4. Htop/Glances/Dstat性能测试系统监控工具领域的瑞士军刀

    原文链接:https://mp.weixin.qq.com/s/TvfzIy4uXHPOFQ1h5Q4KWg 建议点击原文链接查看 续上篇分享的[性能测试工具],今天整理了常用的系统监控工具,当然有特 ...

  5. 已解决[Authentication failed for token submission,Illegal hexadecimal charcter s at index 1]

    在初次学习使用shiro框架的时候碰到了这个问题,具体报错情况如下: [org.apache.shiro.authc.AbstractAuthenticator] - Authentication f ...

  6. 3D视觉基础(基本原理及3D传感器基本参数)

    本人所在行业属于3D视觉方向,因此最近也是学习了很多3D视觉的知识,这次专门总结一下. 传统工业机器视觉中,2D指的是X方向加Y方向,那么3D视觉自然就是加了一个Z方向.目前我接触到的公司产品是3D激 ...

  7. [256个管理学理论]001.蝴蝶效应(Butterfly Effect)

    蝴蝶效应(Butterfly Effect) 来自于大洋彼岸的让你看不懂的解释: 蝴蝶效应是指在一个动力系统中,初始条件下微小的变化能带动整个系统的长期的巨大的连锁反应,是一种混沌的现象.“蝴蝶效应” ...

  8. 【asp.net core 系列】 1 带你了解一下asp.net core

    0. 前言 这是一个新的系列,名字是<ASP.NET Core 入门到实战>.这个系列主讲ASP.NET Core MVC,辅助一些前端的基础知识(能用来实现我们需要的即可,并非主讲).同 ...

  9. 数据库原理实验指导(三)使用SQL语言进行简单查询【转载csdn】

    --1.查询全体学生的学号和姓名select sno,sname from student --2.查询全体学生的详细记录select * from student --3.查询软件学院的学生姓名,年 ...

  10. 02 . Nginx平滑升级和虚拟主机

    Nginx虚拟主机 在真实的服务器环境,为了充分利用服务器资源,一台nginx web服务器会同时配置N个虚拟主机,这样可以充分利用服务器的资源,方便管理员的统一管理 配置nginx虚拟主机有三种方法 ...