Spring源码-IOC部分-容器简介【1】
实验环境:spring-framework-5.0.2、jdk8、gradle4.3.1
- Spring源码-IOC部分-容器简介【1】
- Spring源码-IOC部分-容器初始化过程【2】
- Spring源码-IOC部分-Xml Bean解析注册过程【3】
- Spring源码-IOC部分-自定义IOC容器及Bean解析注册【4】
- Spring源码-IOC部分-Bean实例化过程【5】
- Spring源码-IOC部分-Spring是如何解决Bean循环依赖的【6】
一、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】的更多相关文章
- Spring源码-IOC部分-容器初始化过程【2】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Spring源码-IOC部分-自定义IOC容器及Bean解析注册【4】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Spring源码-IOC部分-Spring是如何解决Bean循环依赖的【6】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Spring源码-IOC部分-Xml Bean解析注册过程【3】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Spring源码-IOC部分-Bean实例化过程【5】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Spring源码-IOC部分-循环依赖-用实例证明去掉二级缓存会出现什么问题【7】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Spring源码——IOC控制反转
1.基础知识 Spring有两个核心功能,分别是ioc和aop,其中ioc是控制反转,aop是切面编程. 在ioc中,还有一个名次叫DI,也就是依赖注入.嗯,好像IOC和DI是指同一个,好像又感觉他俩 ...
- spring源码学习之容器的扩展(二)
六 BeanFactory的后处理BeanFactory作为spring容器的基础,用于存放所有已经加载的bean,为了保证程序上的高扩展性,spring针对BeanFactory做了大量的扩展,比如 ...
- spring源码:web容器启动(li)
web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...
随机推荐
- 【LeetCode】287. Find the Duplicate Number 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 保存已经访问过的数字 链表成环 二分查找 日期 题目 ...
- computer(hdu2196)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- Pikachu漏洞练习-SQL-inject(持续更新)
本来在bup中repeater模式可以多次测试,但不知为何总是出错 这里把我们想查询的数据库和版本进行联合查询,放包,页面回显数据库名称和版本分别为pikachu,5.7.26 数据库版本大于5那么i ...
- MySQL 高级内容
MyISAM 和 MEMORY 存储引擎支持表级锁定(table-level locking),InnoDB 存储引擎支持行级锁定(row-level locking),BDB 存储引擎支持页级锁定( ...
- Cython编译动态库、引用C/C++文件
将某些.py 编译成动态库 设置好要编译的module们: compile_to_c_modules = [ 'package.module' ] 将它们转换成cythonize可识别的参数: def ...
- 一文搞懂Google Navigation Component
一文搞懂Google Navigation Component 应用中的页面跳转是一个常规任务, Google官方提供的解决方案是Android Jetpack的Navigation componen ...
- HTML网页设计基础笔记 • 【第1章 HTML5基础】
全部章节 >>>> 本章目录 1.1 HTML介绍及开发工具 1.1.1 HTML 的基本概念 1.1.2 网页 1.1.3 Web 标准 1.1.4 HTML5 与移动互 ...
- .net core使用rabbitmq消息队列
看博文的朋友,本文有些过时了,还有些BUG,如果想了解更多用法,看看这篇吧:.net core使用rabbitmq消息队列 (二) 首先,如果你还没有安装好rabbitmq,可以参考我的博客: Ubu ...
- x86-2-保护模式(protect mode)
x86-2-保护模式(protect mode) 引入保护模式的原因: 操作系统负责计算机上的所有软件和硬件的管理,它可以百分百操作计算机的所有内容.但是,操作系统上编写的用户程序却应当有所限制,比如 ...
- spring boot 解决 跨域 的两种方法 -- 前后端分离
1.前言 以前做项目 ,基本上是使用 MVC 模式 ,使得视图与模型绑定 ,前后端地址与端口都一样 , 但是现在有些需求 ,需要暴露给外网访问 ,那么这就出现了个跨域问题 ,与同源原则冲突, 造成访问 ...