写点什么

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

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:1815 字

    阅读完需:约 6 分钟


分析容器如何实现




在 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 是需要进行配置的!


![在这里插入图片描述](ht


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


tps://img-blog.csdnimg.cn/e9b5cf4d60144f0e80c51bc6e72f914e.png#pic_center)


  • 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 的配置清单、指定忽略类型等功能

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Spring(一):容器的实现——两大核心类