实验环境:spring-framework-5.0.2、jdk8、gradle4.3.1

一、Spring中几个概念

1.1 BeanDefinition

  • Spring IoC容器管理我们定义的各种Bean对象及其相互关系,Bean对象在Spring实现中是以BeanDefinition来描述的。
  • BeanDefinition接口定义了bean的基本属性。
  • AbstractBeanDefinition实现了大部分逻辑,并定义了一些抽象方法交给子类实现。

1.2 BeanDefinitionRegistry

BeanDefinitionRegistry接口用于注册beanDefinition,其中定义了register、remove、get、contains、getCount等对beanDefinition操作的方法。

1.3 BeanDefinitionReader

  • Bean的解析主要就是对Spring配置文件的解析,这个解析过程主要通过BeanDefinitionReader来完成。
  • BeanDefinitionReader接口定义了getRegistry、getResourceLoader、getBeanClassLoader、loadBeanDefinitions等方法。
  • 其中AbstractBeanDefinitionReader内置了BeanDefinitionRegistry、ResourceLoader、ClassLoader,实现了loadBeanDefinitions方法。
  • BeanDefinitionReaderUtils提供了BeanDefinition的创建、注册等公共方法。

1.4 BeanFactory

  • BeanFactory:对IOC容器的基本行为做了定义
  • ListableBeanFactory:表示这些Bean可列表化
  • HierarchicalBeanFactory:表示这些Bean 是有继承关系的
  • AutowireCapableBeanFactory :定义Bean的自动装配规则
  • 【重要】DefaultListableBeanFactory:继承上面所有特性,实现了bean的定义和注册逻辑。内置beanDefinitionMap,也就是注册的bean都存在这个map里。

1.5 ResourceLoader

  • ResourceLoader定义了getResource和getClassLoader方法。
  • DefaultResourceLoader继承ResourceLoader,内置ClassLoader,主要负责资源路径的定义。

二、Spring容器简介

2.1 AbstractApplicationContext

  • AbstractApplicationContext是所有容器的父类,使用模板方法模式,提供了几乎ApplicationContext的所有操作。
  • 主要有容器工厂的处理,事件的发送广播,监听器添加,容器初始化操作refresh方法,然后是bean的生成获取方法接口等。

AbstractApplicationContext继承结构

AbstractApplicationContext派生体系

这里我是按继承结构划分为Refreshbale类和Generic类。注意:本文是按照类继承结构来划分的,也可以按照特性划分为Config类和Web类。

2.2 Refreshable类容器

2.2.1 AbstractRefreshableApplicationContext抽象类

  • 是个抽象类,继承了父类AbstractApplicationContext的所有能力,负责容器的刷新与创建。
  • 实现了父类的refreshBeanFactory方法,通过创建DefaultListableBeanFactory实例完成容器的初始化。其中loadBeanDefinitions(加载bean配置文件)是个抽象方法,具体实现交给子类。

2.2.2 AbstractRefreshableConfigApplicationContext抽象类

是个抽象类,继承了父类AbstractRefreshableApplicationContext。这个类仅仅封装了configLocations对资源进行定位,具体操作都是子类中。

2.2.3 AbstractXmlApplicationContext抽象类

继承了AbstractRefreshableConfigApplicationContext。主要实现了loadBeanDefinitions对资源进行加载,内部使用XmlBeanDefinitionReader加载器。

2.2.4 ClassPathXmlApplicationContext

  • AbstractXmlApplicationContext的子类,主要对类路径xml配置文件进行加载与初始化(refresh方法),是真正的容器实例。
  • 该类封装了configResources对资源进行定位,也可支持父类的configLocations,只负责配置资源路径,具体加载交给父类AbstractXmlApplicationContext操作,父类调用loadbeanDefinitions方法来加载资源,使用的是XmlBeanDefinitionReader加载器。

ClassPathXmlApplicationContext类继承结构

使用示例

2.2.5 FileSystemXmlApplicationContext

  • AbstractXmlApplicationContext的子类,主要对文件路径xml配置文件进行加载与初始化,通过setConfigLocations对资源进行定位,调用refresh方法初始化容器,是真正的容器实例。
  • 和ClassPathXmlApplicationContext一样,只负责资源的定位,具体初始化过程交给父类来处理。

FileSystemXmlApplicationContext类继承结构

使用示例

2.2.6 AbstractRefreshableWebApplicationContext抽象类

  • 是个抽象类,继承AbstractRefreshableConfigApplicationContext。
  • 实现了WebApplication接口,内置ServletContext,为容器添加了web特性。
  • 这里没有实现loadBeanDefinitions,是交给子类来做的。

AbstractRefreshableWebApplicationContext继承结构

2.2.7 AnnotationConfigWebApplicationContext

  • AbstractRefreshableWebApplicationContext子类实现。
  • web版本容器,接受带注释的类作为输入的实现,特别是@Configuration注解。
  • 通过register配置类或scan包扫描的方式加载bean,并重写了loadBeanDefinitions。

AnnotationConfigWebApplicationContext类继承结构

使用示例

2.2.8 XmlWebApplicationContext

  • AbstractRefreshableWebApplicationContext子类实现,想要创建一个web容器可以继承AbstractRefreshableWebApplicationContext。
  • 为web应用准备,其中DispatcherServlet的父类FrameworkServlet用它作为默认容器,也可以不使用它。

XmlWebApplicationContext类继承结构

2.2.9 GroovyWebApplicationContext

  • AbstractRefreshableWebApplicationContext子类实现。
  • 支持Groovy语法的web容器,用于支持groovy bean配置文件。

GroovyWebApplicationContext类继承结构

2.3 Generic类容器

2.3.1 GenericApplicationContext

  • AbstractApplicationContext的子类实现的通用容器,它能加载各种配置文件,例如xml,properties等,需要指定资源加载器。
  • 它的内部持有一个DefaultListableBeanFactory的实例,实现了BeanDefinitionRegistry接口,以便允许向其应用任何bean的定义的读取器。
  • 为了能够注册bean的定义,refresh()只允许调用一次。

GenericApplicationContext类继承结构

使用示例

2.3.2 GenericXmlApplicationContext

  • GenericApplicationContext的子类。
  • 内置了对XML的支持,它非常的方便和灵活,是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext的一种替代品。
  • 它的内部有一个XmlBeanDefinitionReader的实例,专门用于处理XML的配置。

GenericXmlApplicationContext类继承结构

使用示例

2.3.3 GenericWebApplicationContext

  • GenericApplicationContext的子类,实现了WebApplication接口,内置ServletContext,添加了web特性。

GenericWebApplicationContext类继承结构

2.3.4 GenericGroovyApplicationContext

  • 适用与Groovy环境,内置了GroovyBeanDefinitionReader资源加载器。

GenericGroovyApplicationContext类继承结构

2.3.5 AnnotationConfigApplicationContext

  • 独立的应用程序上下文,接受带注释的类作为输入,特别是带@Configuration注释的类。
  • 内置AnnotatedBeanDefinitionReader资源加载器和ClassPathBeanDefinitionScanner路径扫描器。
  • 通过register配置类或scan包扫描的方式加载bean。

AnnotationConfigApplicationContext类继承结构

使用示例

2.3.6 StaticApplicationContext

  • ApplicationContext的实现,支持 bean 和消息的程序化注册,而不是从外部配置源读取 bean 定义,主要用于测试。

StaticApplicationContext类继承结构

参考资料:

《Spring5核心原理与30个类手写》作者 谭勇德

《Spring源码深度解析》作者 郝佳

《Spring技术内幕》作者 计文柯

Spring源码-IOC部分-容器简介【1】的更多相关文章

  1. Spring源码-IOC部分-容器初始化过程【2】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  2. Spring源码-IOC部分-自定义IOC容器及Bean解析注册【4】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  3. Spring源码-IOC部分-Spring是如何解决Bean循环依赖的【6】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  4. Spring源码-IOC部分-Xml Bean解析注册过程【3】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  5. Spring源码-IOC部分-Bean实例化过程【5】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  6. Spring源码-IOC部分-循环依赖-用实例证明去掉二级缓存会出现什么问题【7】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  7. Spring源码——IOC控制反转

    1.基础知识 Spring有两个核心功能,分别是ioc和aop,其中ioc是控制反转,aop是切面编程. 在ioc中,还有一个名次叫DI,也就是依赖注入.嗯,好像IOC和DI是指同一个,好像又感觉他俩 ...

  8. spring源码学习之容器的扩展(二)

    六 BeanFactory的后处理BeanFactory作为spring容器的基础,用于存放所有已经加载的bean,为了保证程序上的高扩展性,spring针对BeanFactory做了大量的扩展,比如 ...

  9. spring源码:web容器启动(li)

    web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...

随机推荐

  1. 【LeetCode】398. Random Pick Index 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 每次遍历索引 字典保存索引 蓄水池抽样 日期 题目地 ...

  2. Exploring Architectural Ingredients of Adversarially Robust Deep Neural Networks

    目录 概 主要内容 深度 宽度 代码 Huang H., Wang Y., Erfani S., Gu Q., Bailey J. and Ma X. Exploring architectural ...

  3. 图片 Augmentation整理

    目录 Augmentation Flipping 翻转 Grayscale Equalize 均衡直方图 Posterize 减少颜色通道位数 Cropping Rotation Translatio ...

  4. MCMC using Hamiltonian dynamics

    目录 算法 符号说明 Hamilton方程 物理解释 一些性质 可逆 Reversibility H的不变性 保体积 Volume preservation 辛 Symplecticness 离散化H ...

  5. Android studio 报错 Unable to resolve dependency for ‘:app@releaseUnitTest/compileClasspath‘:

    出现报错: Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not find any ...

  6. Python + Selenium 定位非selected型下拉框的方法

    最近在尝试给自己负责的模块写UI自动化的Demo 登录及切换页面比较顺利 但是遇到下拉框的选择时,遇到了一点困难 我负责的模块页面的下拉框并非Select类型,无法使用select_by_index ...

  7. 初识python: 字符串常用操作

    直接上代码示例: #!/user/bin env python # author:Simple-Sir # time:20180914 # 字符串常用操作 name = 'lzh lyh' print ...

  8. List<FieldModelBase> 转 DataTable

    // List<FieldModelBase> 转 DataTable private DataTable ListToDataTable(List<FieldModelBase&g ...

  9. Linux上天之路(十三)之系统进程管理

    主要内容 进程介绍 进程管理 进程优先级 1. 进程介绍 Linux系统中的几乎任何行动都会以进程的形式进行.如果你用网络浏览器查看网页,浏览器就作为进程运行.如果键入bash shell的命令行,这 ...

  10. Echart可视化学习(五)

    文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 常见的数据可视化库: D3.js ...