Spring5源码浅析(五)—DefaultListableBeanFactory之总览

        通过前四篇《Spring5源码浅析(一)--BeanFactory》《Spring5源码浅析(二)-- ListableBeanFactory与HierarchicalBeanFactory》《Spring5源码浅析(三)-- ConfigurableBeanFactory》《Spring5源码浅析(四)--ConfigurableListableBeanFactory》的分享,我们对于SpringIOC容器的基本功能有了一个较为全面的了解,从本篇开始,我们会着重通过几个具体的IOC容器,来看一看IOC容器功能的实现,而在这些具体的容器中,我们首先要看的就是DefaultListableBeanFactory.我们先通过下图来看一下DefaultListableBeanFactory的继承和实现体系:

图 1

        在这个继承和实现体系中,除了BeanDefinitionRegistry与AliasRegistry之外,其他的几个,ConfigurableListableBeanFactory(在《Spring5源码浅析(四)--ConfigurableListableBeanFactory》中,我们有了较为详细的介绍,包括API)主要是用于对Bean做一些修改和获取(getBeanDefinition等)的操作,包括预实例化一个单例对象等.AutowireCapableBeanFactory(详细介绍可参考《Spring5源码浅析(四)--ConfigurableListableBeanFactory》)主要是用于自动装配、Bean初始化(BeanPostProcessors)、Bean的生命周期控制(createBean,destroyBean等)、Bean的依赖解析(resolveDependency)等这些功能,ConfigurableBeanFactory(详细介绍包括API可参考《Spring5源码浅析(三)--ConfigurableBeanFactory》)主要用于配置BeanFactory,包括了我们可以设置一个父级的BeanFactory(setParentBeanFactory),添加类加载器(setBeanClassLoader,setTempClassLoader), 注册自定义的属性编辑器(registerCustomEditor),在”singleton”与”prototype”这两个内置的scope外,注册额外自定义的Scope(registerScope),设置类型转换器(setTypeConverter)等这些功能.而SingletonBeanRegistry(详细介绍包括API可参考《Spring5源码浅析(三)--ConfigurableBeanFactory》)则主要用于提供一种统一的方式(登记/注册)来管理共享的单例Bean,比如注册一个单例Bean(registerSingleton),获取一个单例Bean(getSingleton)等.并且以上提到的这些接口之间也是有关系的,如下图(黄色部分)所示:

图 2

        除了这四个接口我们之前讲过之外,就只有图1中的BeanDefinitionRegistry与AliasRegistry可能对于我们还比较陌生。这两个接口,其实也是有关系的,BeanDefinitionRegistry接口继承了AliasRegistry接口.

       我们先来看一下AliasRegistry接口,这个接口是管理别名的通用型接口,他的实现类是BeanDefinitionRegistry,它提供了四个函数:

      registerAlias(String name,String alias): 给定一个名字,注册它的别名

      removeAlias(String alias): 从registry中删除指定的别名

      isAlias(String name): 确定给定的名字是否被作为别名定义(与真实注册的组件名字相对)

      getAliases(String name): 给定一个组件的名字,如果这个组件定义了别名,就返回该组件的所有别名.

      现在我们来看一下BeanDefinitionRegistry,这个接口主要为持有BeanDefinition的注册者提供的接口,例如:RootBeanDefinition和ChildBeanDefinition实例.比较典型的应用是被那些内部使用了AbstractBeanDefinition层级进行协作的BeanFactory来实现.这只是Spring的bean factory包里的一个封装了BeanDefinition的注册信息的接口.标准的BeanFactory接口只提供对拥有完整配置的factory实例的访问.Spring的BeanDefinition Reader期望能够在这个接口的实现类上运行.这个接口在Spring包中被广为人知的两个实现一个是DefaultListableBeanFactory,另一个是GenericApplicationContext.这个接口提供了7个函数,这7个也比较容易理解:

        registerBeanDefinition(String beanName,BeanDefinition beanDefinition): 在当前的registry中注册一个新的BeanDefinition. 这个接口必须要支持RootBeanDefinition和ChildBeanDefinition.

        removeBeanDefinition(String beanName): 移除给定名字的BeanDefinition.

        getBeanDefinition(String beanName): 返回给定名字的BeanDefinition

        containsBeanDefinition(String beanName): 检查当前Registry中是否包含给定名字的BeanDefinition.

        getBeanDefinitionNames(): 返回在这个Registry中定义的所有Bean的名字.

        getBeanDefinitionCount(): 返回在这个Registry中定义的Bean的数目

        isBeanNameInUse(String beanName): 确定在这个Registry中给定名字的Bean名称是否已经被使用了.换句话说,在这个Registry中是否已经注册过了相同的Bean或者别名.

        现在我们已经梳理完了这个继承体系中,所有的接口及其API了,我们下次将会沿着这个继承体系来看一看SpringIOC的一些实现机理.从而学习一下大牛的编码习惯和思想.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值