Spring源码解读:核心类DefaultListableBeanFactory的继承体系
1 简介
我们常用的ClassPathXmlApplicationContext是AbstractRefreshableApplicationContext的子类,而DefaultListableBeanFactory类型的beanFactory又是AbstractRefreshableApplicationContext的一个成员属性,也就是说ClassPathXmlApplicationContext运用了组合的方式扩展了DefaultListableBeanFactory的功能,使其自身成为了一个上下文容器。

另外XmlBeanFactory继承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整个bean加载的核心部分,是 Spring 注册及加载 bean 的默认实现.

而对于 XmlBeanFactory与DefaultListableBeanFactory 不同的地方其实是在 XmlBeanFactory 中使用了自定义的XML 读取器XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取DefaultListableBeanFactory继承了 AbstractAutowireCapableBeanFactory 并实现了ConfigurableListableBeanFactory 以及BeanDefinitionRegistry接口。
2 继承层次分析

DefaultListableBeanFactory的继承体系层次图
各个类的主要功能和API:
1)AliasRegistry
定义对alias的简单增删改等操作
//通用的别名管理接口
public interface AliasRegistry { //Given a name, register an alias for it.
void registerAlias(String name, String alias); /**
* Remove the specified alias from this registry.
*/
void removeAlias(String alias); /**
* Determine whether this given name is defines as an alias
* (as opposed to the name of an actually registered component).
*/
boolean isAlias(String name); /**
* Return the aliases for the given name, if defined.
*/
String[] getAliases(String name);
}
2)SimpleAliasRegistry
主要使用map作为alias的缓存,并对接口AliasRegistry进行实现.

3)SingletonBeanRegistry
定义对单例的注册及获取
//Interface that defines a registry for shared bean instances.
public interface SingletonBeanRegistry { /**
* Register the given existing object as singleton in the bean registry,
* under the given bean name.
*/
void registerSingleton(String beanName, Object singletonObject); /**
* Return the (raw) singleton object registered under the given name.
*/
@Nullable
Object getSingleton(String beanName); /**
* Check if this registry contains a singleton instance with the given name.
*/
boolean containsSingleton(String beanName); /**
* Return the names of singleton beans registered in this registry.
*/
String[] getSingletonNames(); /**
* Return the number of singleton beans registered in this registry.
*/
int getSingletonCount(); /**
* Return the singleton mutex used by this registry (for external collaborators).
*/
Object getSingletonMutex();
}
4)BeanDefinitionRegistry
定义对BeanDefinition的各种增删改操作
/**
* Interface for registries that hold bean definitions, for example RootBeanDefinition
* and ChildBeanDefinition instances. Typically implemented by BeanFactories that
* internally work with the AbstractBeanDefinition hierarchy.
*/
public interface BeanDefinitionRegistry extends AliasRegistry { /**
* Register a new bean definition with this registry.
* Must support RootBeanDefinition and ChildBeanDefinition.
*/
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException; /**
* Remove the BeanDefinition for the given name.
*/
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; /**
* Return the BeanDefinition for the given bean name.
*/
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; /**
* Check if this registry contains a bean definition with the given name.
*/
boolean containsBeanDefinition(String beanName); /**
* Return the names of all beans defined in this registry.
*/
String[] getBeanDefinitionNames(); /**
* Return the number of beans defined in the registry.
*/
int getBeanDefinitionCount(); /**
* Determine whether the given bean name is already in use within this registry,
* i.e. whether there is a local bean or alias registered under this name.
*/
boolean isBeanNameInUse(String beanName);
}
5)BeanFactory
定义获取bean及bean的各种属性。

6)DefaultSingletonBeanRegistry
对接口SingletonBeanRegistry各函数的实现

7)HierarchicalBeanFactory
扩展了BeanFactory,新增了两个抽象方法,提供了对父工厂parentBeanFactory和内嵌Bean的支持
/**
* Sub-interface implemented by bean factories that can be part
* of a hierarchy.
*/
public interface HierarchicalBeanFactory extends BeanFactory { /**
* Return the parent bean factory, or {@code null} if there is none.
*/
BeanFactory getParentBeanFactory(); /**
* Return whether the local bean factory contains a bean of the given name,
* ignoring beans defined in ancestor contexts.
*/
boolean containsLocalBean(String name);
}
8)ListableBeanFactory
提供了以类型、名字、注解等条件获取相关bean的各种配置信息的抽象方法。

9)FactoryBeanRegistrySupport
在DefaultSingletonBeanRegistry基础上增加了对
FactoryBean的特殊处理功能,没有新增的公用API,几乎全是protected级别的方法(主要是对FactoryBean的支持,FactoryBean不返回实例本身,而是返回此工厂方法getBean()的返回对象),以供子类调用或重写。

10)ConfigurableBeanFactory
其公用API主要是以“setXXX"、“getXXX”、"registerXXX"开头的设定或获取配置的方法,它提供配置Bean的各种方法。
部分API图
11)AbstractBeanFactory
综合 FactoryBeanRegistrySupport与ConfigurableBeanFactory的功能,即综合了支持父工厂和配置bean的两种功能。

部分API图
12)AutowireCapableBeanFactory
提供创建bean、自动注入、初始化以及应用bean的后处理器

13)ConfigurableListableBeanFactory
BeanFactory配置清单,指定忽略类型及接口等

14)AbstractAutowireCapableBeanFactory
综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现

部分API图
15)DefaultListableBeanFactory
综合上面所有功能,主要是对Bean注册后的处理.
参考:《Spring源码深度解析(第2版)》
Spring源码解读:核心类DefaultListableBeanFactory的继承体系的更多相关文章
- Spring源码解析——核心类介绍
前言: Spring用了这么久,虽然Spring的两大核心:IOC和AOP一直在用,但是始终没有搞懂Spring内部是怎么去实现的,于是决定撸一把Spring源码,前前后后也看了有两边,很多东西看了就 ...
- Spring源码解析-核心类之XmlBeanFactory 、DefaultListableBeanFactory
DefaultListableBeanFactory XmlBeanFactory 继承自 DefaultListableBeanFactory , 而 DefaultListableBeanFact ...
- Spring源码解析-核心类之XmlBeanDefinitionReader
XmlBeanDefinitionReader XML配置文件的读取是 Spring 中重要的功能,因为 Spring 的大部分功能都是以配置作为切入点的,那么我们可以从 XmlBeanDefinit ...
- 转 Spring源码剖析——核心IOC容器原理
Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...
- Spring源码解读之BeanFactoryPostProcessor的处理
前言 前段时间旁听了某课堂两节Spring源码解析课,刚好最近自己又在重新学习中,便在这里记录一下学习所得.我之前写过一篇博文,是介绍BeanFactoryPostProcessor跟BeanPost ...
- 【Spring源码解读】bean标签中的属性
说明 今天在阅读Spring源码的时候,发现在加载xml中的bean时,解析了很多标签,其中有常用的如:scope.autowire.lazy-init.init-method.destroy-met ...
- Spring源码解读--(一)源码下载
走在Java程序员这条路上,网上Java各种工具满天飞,写个简单的CRUD,相信是个开发都能写出来,于是在思考如何可以在同行业中更有竞争力(其实就是如何赚更多钱).那么,老大给我推荐了Spring源码 ...
- Spring源码解读Spring IOC原理
一.什么是Ioc/DI? IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等. 先从我们自己设计这样一个视角来考虑: 所谓控制反转,就是把原先我们代码里面需要实现的对象创建.依赖的代码,反 ...
- junit源码解析--核心类
JUnit 的概念及用途 JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个开源的单元测试框架.它属于白盒测试,只要将待测类继承 TestCase 类,就可以利用 JUnit ...
随机推荐
- S7-200 smart输入输出接口试验
工具 西门子 s7-200smart PLC 西门子s7-200 smart 试验 CPU型号是 SR30 这个 编译环境 符号 选择 了 "输入1"以后, 会自动的编地址为I0. ...
- P 1038 统计同成绩学生
转跳点:
- Ubuntu不会放弃32位应用程序
Ubuntu 开发人员澄清,人们以为 Ubuntu 将在 Ubuntu 19.10 和后续版本中放弃对运行 32 位应用程序的支持,但“根本不是这种情况”.那么这究竟是怎么一回事呢?前几天 Ubunt ...
- P30 Pro劲敌!DxO官宣新机:排行榜又要变
均为111分,接着是华为Mate 20 Pro.P20 Pro和三星Galaxy S10+,三款机型综合得分均为109分,前10名最后三款机型分别是小米9.iPhone XS Max和HTC U12+ ...
- tensorflow学习笔记--dataset使用,创建自己的数据集
数据读入需求 我们在训练模型参数时想要从训练数据集中一次取出一小批数据(比如50条.100条)做梯度下降,不断地分批取出数据直到损失函数基本不再减小并且在训练集上的正确率足够高,取出的n条数据还要是预 ...
- Springboot Bean循环依赖问题
参考博客原文地址: https://www.jb51.net/article/168398.htm https://www.cnblogs.com/mianteno/p/10692633.html h ...
- 167-PHP 文本分割函数str_split(二)
<?php $str='PHP is a very good programming language'; //定义一个字符串 $arr=explode(' ',$str,-3); //使用空格 ...
- MVC 中引用Angularjs
首先在Maname NuGet Packages中 安装相应的包,我用的是作者为 AngualrJS Team的 随后在相应的Scripts中会出现对应文件. 如果只在某一个页面中使用Angualrj ...
- 干货分享:Research Essay写作规范详解
同学们在刚到国外时觉得一切都很新鲜,感觉到处都在吸引着他们,但是大部分留学生在刚碰到Research Essay便是一头包.其实Research Essay也没有想象中的那么难,只是留学生们初次接触, ...
- Kylin笔记
简介 Apache Kylin(Extreme OLAP Engine for Big Data)是一个开源的分布式 分析引擎,为Hadoop等大型分布式数据平台之上的超大规模数据集通过标准 SQL查 ...