Spring(一):容器的实现——两大核心类
在 Sping 官网中的一段入门代码
todo
步骤如下
读取 Spring 的配置文件
从配置文件中找到对应 Bean 的信息(bean 的那一段信息)
根据找到的 Bean 信息进行实例化 Bean
所以要想实现容器,至少需要 3 个类
ConfigReader:用来读取和校验配置文件,读取完后放入内存中等待使用
ReflectionUtil:从内存中取出配置文件并取出 Bean 的信息,然后进行实例化 Bean
App:串联 ConfigReader 和 ReflectionUtil 去完成整个 Bean 的实例化操作
当然,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
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 的配置清单、指定忽略类型等功能
评论