实验环境: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. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    本来今天是想做RabbitMQ之优先级队列的,但是,在RabbitMQ Server创建queue时,增加优先级的最大值,头脑发热写了9999999,导致电脑内存直接飙到100%,只能重启电脑,并卸载 ...

  2. SROP

    先放个例题吧,原理后面有时间再更:BUUCTF ciscn_2019_s_3 保护只开了nx 1 signed __int64 vuln() 2 { 3 signed __int64 v0; // r ...

  3. 编写Java程序,使用Set实现不重复添加用户

    返回本章节 返回作业目录 需求说明: 在控制台输入用户信息,用户信息包括姓名.性别和年龄,将用户信息保存至User对象中. 将User对象保存至HashSet集合中. 规定如果两个User对象的姓名. ...

  4. MySQL客户端mysql常用命令

    通过MySQL自带的mysql命令行工具, 执行MySQL的相关命令. 1.连接MySQL服务端 mysql -uUserName -pPassword -h HostName_IP -P 3306 ...

  5. centos6.5-搭建Apache-地址限制和用户访问

    对于企业内部的WEB管理平台,例如日志分析系统(Awstats)为了更好实现访问控制,在通过客户端访问时,提交一些用户密码或对客户IP地址进行授权,避免服务器的安全隐患. 常见的访问控制方式:应用于配 ...

  6. SpringBoot 原理分析、监控、项目部署

    目录 SpringBoot 监控 概述 使用 SpringBoot Admin 概述 使用 SpringBoot 项目部署 SpringBoot 监控 概述 SpringBoot 自带监控功能 Act ...

  7. springCloudGateway-使用记录

    一.需求描述 旧项目做好之后,已经维护了一两个月,基本上已经趋于稳定,按照项目的整体进度基本上不会在做什么改动.新项目已经确定 下来,只是有一个大概的需求,unity3d的客户端已经开始做,在这个月2 ...

  8. 欢迎收看 Flink Forward Asia 2021 峰会直播

    在线收看地址:https://developer.aliyun.com/special/ffa2021/live#?utm_content=g_1000316459 Flink 是由 Apache 软 ...

  9. 初识python: 类练习 - 老板&员工

    需求: 1.员工具有姓名.年龄.能力值(能力值为100-年龄),可以工作,每工作一次,该员工的能力值-5,创建__str__方法,打印该员工的信息: 2.老板具有投资金额,工作量,员工列表.可以雇佣员 ...

  10. 初识python: random 模块

    random 顾名思义,就是取 随机数,需要导入random模块. import random 1.随机获取一个0到1之间的小数(不含首尾) print(random.random()) 2.随机获取 ...