前言

spring源码里面包含了很多的模块,也提供了很多功能,如果去一一叙述这些模块及其对应的功能,必然会是长篇大论,我个人比较讨厌一开始就去介绍所有的模块的功能,虽然能够让我了解整体的项目结构,但是读的时候却稍显枯燥,所以我决定跳过最基础也是最常见的模块的概览部分,直接进入源码的学习。

从哪儿开始入手学习spring的源码呢?

在我刚接触spring的时候,就不可避免的接触到了两个词汇---IOC和AOP,几乎每一本教材,每一篇blog都会反复的提到这两个词,阐述其意义,其重要性。

讲道理的话,在刚开始学习spring的时候,我不是很明白这两个词汇的意义,感觉很抽象,理解起来很片面,总感觉抓不到核心的地方,后来随着对spring使用的增多,才慢慢的理解了IOC和AOP的意义。 现在想想,在那时候,IOC和AOP真是我学习spring的一道坎。

所以我觉得学习spring还是从这两个词汇入手吧,毕竟从哪摔倒从哪爬起来不是。

先学会IOC和AOP相关的知识,这样由理解核心实现入手,然后再抽丝剥茧的学会他们外层的技术,应该会容易很多吧?

Spring官方文档

该文档记录了spring框架的核心技术实现,参考该文档,可以更快的理解spring核心技术。

Spring IOC概念的简单理解

对于spring框架来说IOC无疑是其最核心的技术之一,他改变了我们创建实例时的过程和思维,提供了一种全新的实例创建过程。 在不使用IOC的前提下,我们创建一个对象实例,通常都会手动的new出该对象实例,之后再根据需要去设值其依赖的对象,这是一种比较常见的方式,我们维护着整个对象实例的生命周期,我们自己负责对象实例的创建,同时我们也自己维护着对象之间的依赖关系等一系列操作。(PS:虽然对象的销毁掌握在GC手里,但是我们依然可以很明确的知道对象在何时就开始进入清理倒计时。)

而对于spring IOC来讲,他会维护一个容器,容器持有所有对象的引用以及对象之间的依赖关系 ,当我们需要使用一个对象的时候 ,直接从容器中拿出来该对象使用就可以了,容器会帮助我们完成对象的创建,对象实例之间依赖的创建。

这两者有一个很明显的区别就在于:常规方式下,我们几乎手动维护了整个对象实例的生命周期,在整个过程中我们需要自己手动组装我们需要的对象实例,而在使用spring IOC的前提下,我们仅仅只需要告诉容器对象之间的依赖关系,spring就会帮助我们完成包括组装对象在内的一系列操作。

前者,就好比我们自己买食材自己做饭,而后者更像我们去饭店点菜吃饭,一个亲力亲为,一个坐等享受~

为什么要从ClassPathXmlApplicationContext类入手。

通过前面关于spring IOC概念的叙述中,我们不难理解,spring IOC技术的实现依赖与一个维护了所有对象及其依赖关系的容器,那么这个容器是什么呢?

spring源码中有一个最基础的类叫做BeanFactory,该类提供了一个能够管理任意类型对象的高级配置机制,而该类也恰好就是我们入手学习spring源码的一条线索,但是我们在实际使用spring的过程中几乎很少会使用到BeanFactory,反而其子实现ApplicationContext使用的更多,这是因为BeanFactory仅仅只定义了容器的基础功能,而ApplicationContext在基于BeanFactory定义的功能基础上实现了更多的功能,所以一方面ApplicationContextBeanFactory的实现类,另一方面ApplicationContext也是BeanFactory的超集。

如果从ApplicationContext入手学习,我们不得不又接触另一个叫做ClassPathXmlApplicationContext的类,该类是在初学spring时候就会接触到的一个类,它实现了加载XML文件来初始化Spring容器的能力。

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext('{{Spring XML配置文件}}');

和其实现类似功能的类还有很多,比如:FileSystemXmlApplicationContextAnnotationConfigWebApplicationContext

但是因为相对来说,接触更多的是ClassPathXmlApplicationContext,通常我们也会使用该类作为我们使用spring项目的入口。

就像我们调试代码要从main方法开始一样,调试spring也就从该类开始吧~

初识ClassPathXmlApplicatioContext

ClassPathXmlApplicationContextt类位于spring-context项目org.springframework.context.support包下。

在整个源码调试过程中,默认使用IntelliJ IDEA工具。

我们在IDE工具内打开该类,

之后输入快捷键ctrl+alt+u打开该类的UML图,可以看到其中大概涉及了二三十个类或接口,其中就有我们刚才提到的BeanFactory接口以及ApplicationContext接口

点击查看UML大图

万事开头难,既然找到了入口,接下来的任务就是根据类图,从顶层开始大概了解涉及到的类和接口的作用。

BeanFactory

BeanFactory接口是整个spring容器的底层接口,他定义了在spring中作为一个bean容器需要提供的基本功能——管理Bean定义。

这里有一个好玩的问题,什么是Bean?Bean定义又是什么?

bean以及bean定义的概念

简单的理解bean其实就是java对象,是在spring容器中对java对象的一个称谓,就好像二狗在学校被称为学生一样,二狗还是那个二狗,只不过他多了一个学生的称号,那是不是其他人也能成为学生呢?当然可以,前提是这些人通过入学考试,对于Spring bean也是一样的,java对象还是那个java对象,只不过当他被spring管理之后它就多了bean的称号。

那么什么是Bean定义呢,这里还是要说一下二狗哥,二狗哥进了学校之后,招生办的人就给二狗哥搞了个学籍,学籍里面详细记录了二狗哥作为学生所需的所有数据,什么姓名啊,性别啊,品种(。。呸。。这个不算),年龄啊之类的。这个学籍以后就是二狗哥学生身份的依据了,以后学校就根据这个学籍来管理二狗哥。

一样的道理,当一个java对象被spring容器管理之后,spring会根据这个对象生成一个bean定义,这个bean定义里面了包含了描述bean对象的元数据,emmm...也就是说用来描述bean对象的元数据构成了bean定义。

BeanFactory的概念

在spring中,BeanFactory通常被认为是所有bean的注册中心,它集中进行bean定义的维护和管理操作,因此,BeanFactory也就不可避免的需要维护大量的bean定义,根据常识:

在现实生活中,当需要管理大量同类型实体的时候,我们都会为这些实体提供一个能够识别该实体的唯一标识,比如:中国公民的身份证号,汽车的车牌号等。

对于spring容器来说,道理是一样的道理,spring给所有受spring管理的bean都会生成一个容器内唯一的String类型的唯一标识,并将会根据该标识对bean定义进行维护和管理。

BeanFactory的源码解析

BeanFactory位于spring-beans模块下的org.springframework.beans.factory包内,

查看BeanFactory的中文注释版源码

查看BeanFactory的英文原版注释源码

BeanFactory中定义了13个方法,1一个常量,其大致作用如下图:

其中常量FACTORY_BEAN_PREFIX涉及到了一个叫做FactoryBean的概念,简单的来说FactoryBean就是spring对工厂模式的一种通用实现,通过实现FactoryBean来实现工厂模式的Bean,会被spring容器特殊处理,这里先提出来,后续再继续深入。

转载于:https://my.oschina.net/u/3101282/blog/1844300

spring源码之美三:从IOC概念入手学习Spring相关推荐

  1. 【Spring源码:循环依赖】一文弄懂Spring循环依赖

    1. 什么是循坏依赖 很简单,其实就是互相依赖对方,比如,有一个A对象依赖了B对象,B对象又依赖了A对象. // A依赖了B public class A{private B b; }// B依赖了A ...

  2. spring源码分析第三天------spring核心IOC容器和依赖注入原理

    基于XML的依赖注入 1.依赖注入发生的时间 当 Spring IOC 容器完成了 Bean 定义资源的定位.载入和解析注册以后,IOC 容器中已经管理类 Bean 定义的相关数据,但是此时 IOC ...

  3. @transactional注解原理_《Spring源码解析(十二)》深入理解Spring事务原理,告别面试一问三不知的尴尬...

    本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让 ...

  4. idea调试源代码c语言,IDEA阅读spring源码并调试

    目标:搭建起Spring源码阅读和代码调试跟踪的环境,顺便建立一个简单的Demo,能够调试Spring的源代码 本节,主要介绍一下Spring源码阅读和调试的相关环境搭建,并使用MVN创建一个非常简单 ...

  5. Spring源码分析(三)

    Spring源码分析 第三章 手写Ioc和Aop 文章目录 Spring源码分析 前言 一.模拟业务场景 (一) 功能介绍 (二) 关键功能代码 (三) 问题分析 二.使用ioc和aop重构 (一) ...

  6. Spring源码深度解析:三、容器的刷新 - refresh()

    一.前言 文章目录:Spring源码深度解析:文章目录 我们先通过Spring源码的整体流程,来了解Spring的工作流程是什么,接着根据这个工作流程一步一步的阅读源码 二.Spring容器的启动 p ...

  7. spring源码刨析总结

    spring源码刨析笔记 1.概述 spring就是 spring Framework Ioc Inversion of Control(控制反转/反转控制) DI Dependancy Inject ...

  8. Spring源码解析:自定义标签的解析过程

    2019独角兽企业重金招聘Python工程师标准>>> spring version : 4.3.x Spring 中的标签分为默认标签和自定义标签两类,上一篇我们探究了默认标签的解 ...

  9. Spring源码分析之Bean的创建过程详解

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 本文内容: 在 ...

最新文章

  1. LSM树(Log-Structured Merge Tree)存储引擎
  2. 大学python用什么教材-清华大学出版社-图书详情-《Python大学教程》
  3. [iOS] photoKit获取所有照片
  4. 根据中序、前序遍历重建二叉树
  5. scilab和matlab的区别,matlab 与scilab的比较.doc
  6. 培养创造性思维20个技巧
  7. CUDNN v3特性
  8. Linux下的dhcp测试实现方法
  9. kafka创耳机_生产环境一键创建kafka集群
  10. QT绘图底层是如何适配各种操作系统的
  11. 树莓派安装qq linux,在(Raspberry Pi)树莓派上安装NodeJS
  12. 连接摄像头拍照并识别图片中二维码
  13. magicbook的linux是哪个版本,MagicBook 2019 linux版来了!
  14. DOS命令diskpart格式化磁盘
  15. jacob为word和excel加水印
  16. ipad iphone开发_如何从iPhone或iPad连接到Windows远程桌面
  17. 干货,如何建立数据标签体系
  18. git的学习笔记(一):git本地操作
  19. 屠光绍:公司债启动时机成熟 市场意义重大
  20. thinkpad分区win10_win10系统联想笔记本显示隐藏的分区的还原技巧

热门文章

  1. java的rsa加密算法_用java编程实现RSA加密算法
  2. 彻底卸载Office
  3. systemctl使用reload及踩坑
  4. 如何生成M3U8播放地址用于手机HLS Player(M3U8Player)观看电视频道直播
  5. idea配置tomcat服务器
  6. SnapGene 5.2.4 for Win中英文版 附安装教程
  7. 卷积神经网络简介及其在TensorFlow中的实现
  8. AI数字人:基于VITS模型的中文语音生成训练
  9. 2023年英语六级作文模板
  10. IE 下载 CVS 文件问题