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的继承体系的更多相关文章

  1. Spring源码解析——核心类介绍

    前言: Spring用了这么久,虽然Spring的两大核心:IOC和AOP一直在用,但是始终没有搞懂Spring内部是怎么去实现的,于是决定撸一把Spring源码,前前后后也看了有两边,很多东西看了就 ...

  2. Spring源码解析-核心类之XmlBeanFactory 、DefaultListableBeanFactory

    DefaultListableBeanFactory XmlBeanFactory 继承自 DefaultListableBeanFactory , 而 DefaultListableBeanFact ...

  3. Spring源码解析-核心类之XmlBeanDefinitionReader

    XmlBeanDefinitionReader XML配置文件的读取是 Spring 中重要的功能,因为 Spring 的大部分功能都是以配置作为切入点的,那么我们可以从 XmlBeanDefinit ...

  4. 转 Spring源码剖析——核心IOC容器原理

    Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...

  5. Spring源码解读之BeanFactoryPostProcessor的处理

    前言 前段时间旁听了某课堂两节Spring源码解析课,刚好最近自己又在重新学习中,便在这里记录一下学习所得.我之前写过一篇博文,是介绍BeanFactoryPostProcessor跟BeanPost ...

  6. 【Spring源码解读】bean标签中的属性

    说明 今天在阅读Spring源码的时候,发现在加载xml中的bean时,解析了很多标签,其中有常用的如:scope.autowire.lazy-init.init-method.destroy-met ...

  7. Spring源码解读--(一)源码下载

    走在Java程序员这条路上,网上Java各种工具满天飞,写个简单的CRUD,相信是个开发都能写出来,于是在思考如何可以在同行业中更有竞争力(其实就是如何赚更多钱).那么,老大给我推荐了Spring源码 ...

  8. Spring源码解读Spring IOC原理

    一.什么是Ioc/DI? IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等. 先从我们自己设计这样一个视角来考虑: 所谓控制反转,就是把原先我们代码里面需要实现的对象创建.依赖的代码,反 ...

  9. junit源码解析--核心类

    JUnit 的概念及用途 JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个开源的单元测试框架.它属于白盒测试,只要将待测类继承 TestCase 类,就可以利用 JUnit ...

随机推荐

  1. window 如何访问虚拟机的mapreduce(遇到的坑)

    首先 先把你虚拟机和本机网络链接弄通 (详情看上一篇)  一些关于mapreduce 和hadoop的配置都在上一篇 安装eclipse 的hadoop Map/Reduce插件详情 看其他博客园.. ...

  2. thinkphp配置到二级目录,不配置到根目录,访问除首页的其他路径都是404报错

    1.在nginx的配置里面,进行重定向 vi /etc/nginx/conf.d/default.conf 2.进入编辑 location /thinkphp/public { if (!-e $re ...

  3. P 1008 说反话

    转跳点:

  4. 使用 Dashboard【转】

    上一节我们完成了 Kubernetes Dashboard 的安装,本节就来实践一下. Dashboard 界面结构 Dashboard 的界面很简洁,分为三个大的区域. 顶部操作区在这里用户可以搜索 ...

  5. 关于spring-mvc.xml的静态资源的配置

    转 配置如下: <!-- 配置静态资源 --><mvc:resources location="/static/" mapping="/static/* ...

  6. bzoj 4008、4011、1499

    全是扒题解,,,太弱了... 不乱BB了. 4008 #include <bits/stdc++.h> #define LL long long #define lowbit(x) x&a ...

  7. 020-PHP浏览目录

    <?php // 使用表格浏览目录的结构 print("<TABLE BORDER= '1'>"); // 创建表格的头 print("<TR&g ...

  8. C# ------ MEF

    参考 参考 MEF全称Managed Extensibility Framework, 是一个用于创建可扩展的轻型应用程序的库.开发人员可以利用MEF发现并使用扩展,但并不需要配置,而且还可以在应用程 ...

  9. nidlist 问题

    错误问题如下: 解决方案: Dao文件 boolean DeleteList(String nidList); 改为: boolean DeleteList(@Param("nidList& ...

  10. docker安装出现"Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"

    今天按照这个教程使用WSL安装docker时遇到了个问题: 使用命令:$ docker search mysql 出现:Cannot connect to the Docker daemon at u ...