Spring(一):容器的实现——两大核心类

分析容器如何实现

在Sping官网中的一段入门代码

todo

步骤如下

  1. 读取Spring的配置文件
  2. 从配置文件中找到对应Bean的信息(bean的那一段信息)
  3. 根据找到的Bean信息进行实例化Bean

所以要想实现容器,至少需要3个类

  • ConfigReader:用来读取和校验配置文件,读取完后放入内存中等待使用
  • ReflectionUtil:从内存中取出配置文件并取出Bean的信息,然后进行实例化Bean
  • App:串联ConfigReader和ReflectionUtil去完成整个Bean的实例化操作
    在这里插入图片描述
    当然,Spring没有可能这么简单就是实现

Spring的结构组成

下面就来认识一下Spring框架的整体架构是怎么样的

beans包的层级结构

在这里插入图片描述

  • jmh模块:创建bean的基准
  • main模块:bean模块的核心
  • test和testFixtures:测试模块

核心类

Spring中有两大核心类

  • DefaultListableBeanFactory:默认的bean加载
  • XmlBeanDefinitionReader:读取XML配置文件
DefaultListableBeanFactory

DefaultListableBeanFactory是整个Bean加载的核心部分,像XmlBeanFactory(已弃用)是继承了DefaultListableBeanFactory的,与其不同的是,XmlBeanFactory中使用了自定义的XML读取器,实现了个性化的Bean读取

首先来看看这个核心类的整体架构
在这里插入图片描述
在这里插入图片描述

  • AbstractBeanFactory继承了FactoryBeanRegistrySupport
  • DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory,并且实现了ConfigurableListableBeanFactory和BeanDefinnitionRegistry接口

那么我们就针对这个结构来说明一下各个部分是做什么的,仅仅有个认识

第一条分支,提供别名CRUD、单例注册和获取、FactoryBean操作等功能

  • AliasRegistry:该接口定义了对别名的增删查改操作(上面没显示,该接口是被SimpleAliasRegistry实现了的)
  • SimpleAliasRegistry:实现了AliasRegistry接口,即有对别名的增删查改操作的实现,而且对alias的存储使用了Map来作为缓存
  • SingletonBeanRegistry:该接口定义了对单例的注册及获取(上面没显示,该接口是被DefaultSingletonBeanRegistry实现了的)
  • DefaultSingletonBeanRegistry:实现了SingletonBeanRegistry,也就是实现了对单例的注册及获取方法,并且继承了SimpleAliasRegistry,所以也支持对别名进行操作
  • FactoryBeanRegistrySupport:继承了DefaultSingletonBeanRegistry,所以基础是建立在DefaultSingletonBeanRegistry上的,并且其增加了对FactortyBean的特殊处理,从这里开始,FactoryBeanRegistrySupprt已经支持了别名、单例、FactoryBean的操作了
  • AbstractBeanFactory;继承了FactoryBeanRegistrySupport,并且实现了ConfigurableBeanFactory接口,所以其综合了FactoryBeanRegistrySupport和ConfigurableBeanFactory功能

从现在开始就产生了另外一条分支了,生产Bean需要使用到Factory,然而Factory是需要进行配置的!
在这里插入图片描述

  • BeanFactory:定义一系列获取Bean的方法,根据不同参数、条件去获取Bean,ByType或者ByName

  • HierarchicalBeanFactory:继承了BeanFactory,在BeanFactory基础下增加了对ParentFactory的支持

  • ConfigurableBeanFactory:该接口继承了HierarchicalBeanFactory,并且定义了对Factory进行配置的各种方法(生产Bean需要Factory,而Factory是需要进行配置的)

  • ListableBeanFactory:该接口定义了根据条件去获取Bean的配置信息的方法

到现在为止,AbstractBeanFactory已经可以支持对Factory进行配置,可以根据Factory获取Bean、注册和获取单例、对Bean的别名进行操作功能了

下面继续看AbstractBeanFactory的父类

  • AutowrieCapableBeanFactory:该接口继承了BeanFactory,所以拥有获取Bean的规范,并且提供了创建Bean、自动注入、初始化以及应用Bean的后处理器

  • AbstractAutowireCapableBeanFactory:继承了AbstractBeanFactory,在AbstractBeanFactory基础上,实现了AutowireCapableBeanFactory提供创建Bean、自动注入、初始化以及应用Bean的后处理器,也就是可以自动注入、创建和获取Bean了

  • ConfigurableListableBeanFactory:该接口继承了ListableBeanFactory、AutowireCapableBeanFactory和ConfigurableBeanFactory,并且提供了BeanFactory的配置清单、指定忽略类型等功能

  • DefaultListableBeanFactory:两条线汇总在一起,继承了AbstractAutowireCapableBeanFactory并且继续实现了ConfigurableListableBeanFactory接口,所以综合了以上的所有功能,可以进行配置加载、创建获取Bean、自动注入和初始化功能,并且主要是对bean注册后进行处理

可以看到,DefaultListableBeanFactory对应上了一大堆实现和继承关系

XmlBeanDefinitionReader

使用过Spring的都对XML配置文件不陌生,XML配置文件的读取是Spring中重要的功能,而XmlBeanDefinitionReader则是负责XML配置文件的读取、解析以及注册功能
在这里插入图片描述下面认识几个类和接口的作用

  • ResourceLoader:该接口是定义资源加载器的,主要用来根据给定的地址去加载地址指向的文件的resoure(其实就是stream)
  • BeanDefinitionReader:该接口定义了读取资源文件并且转换为BeanDefinition
  • BeanDefinitionRegistry:该接口定义了对BeanDefinition的各种操作,比如增删查改
  • EnvironmentCapable:该接口定义了获取Environment方法
  • DocumentLoader:该接口定义了从资源文件加载到转换为Document的功能(Document其实就是Java将Xml文件全部载入,并且生成一颗Dom树,每一个节点为一个Element,代表一个标签,子节点就代表当前标签里面的子标签)
  • AbstractBeanDefinitionReader:实现了EnvironmentCapable和BeanDefinitionReader接口,提供了获取Envirionment、读取资源文件并且可以转换为BeanDefinition功能
  • BeanDefinitionDocumentReader:该接口定义了读取Document,并且注册BeanDefinition功能
  • DefaultBeanDefinitionDocumentReader:实现了BeanDefinitionDocumentReader,可以进行解析Document并且注册为BeanDefinition功能

那么这几者的关系跟AbstractBeanDefinitionReader和XmlBeanDefinitionReader有什么关联呢?

  1. 首先,AbstractBeanDefinitionReader是实现了EnvironmentCapable和BeanDefinitionReader接口,所以可以拥有获取Envirionment、读取资源文件转换为BeanDefinition的功能

    在这里插入图片描述

  2. AbstractBeanDefinitionReader里面组装了ResourceLoader,可以通过ResoureceLoader和ClassLoader去获取文件的resoure
    在这里插入图片描述

  3. XmlBeanDefinitio
    nReader组装了DocumentLoader和BeanDefinitionDocumentReader,可以将资源文件转换为Document,并且读取Document,将其注册为BeanDefinition的功能,并且注意,这里的BeanDefinitionDocumentReader是去获取其实现类DefaultBeanDefinitionDocumentReader
    在这里插入图片描述

    1. XmlBeanDefinitionReader继承了AbstractBeanDefinitionReader
    2. AbstractBeanDefinitionReader拥有获取Environment、从文件地址、class文件去获取文件resoure并可以将其转换为BeanDefinition的功能
    3. 而XmlBeanDefinitionReader由于继承了AbstractBeanDefinitionReader,在其基础上,扩展了对Document的获取,和读取Document并转换为BeanDefinition的功能
XmlBeanDefinitionReader的执行步骤
  • 第一步肯定是去读取配置文件,所以通过继承的AbstractBeanDefinitionReader去使用ResoureLoader去获取配置文件的Resoure
  • 第二步就是将得到的Resoure进行转换,通过DocumentLoader来对Resoure文件进行转换成Document文件(生成DOM树)
  • 第三步通过DefaultBeanDefinitionDocumentReader来对Document进行解析,并且会调用BeanDefinitionParserDelegate对Element进行解析,其实就是对Dom树里面的那些标签Element进行解析处理(DefaultBeanDefinitionDocumentReader自身组装BeanDefinitionParserDelegate)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值