Spring5源码浅析(二)—ListableBeanFactory与HierarchicalBeanFactory

      在上一篇中,我们简单分析了一下Spring IOC容器中的根基BeanFactory,今天我们来看一下BeanFactory的两个扩展,ListableBeanFactory与HierarchicalBeanFactory.他们的基本情况如下图所示:

       我们首先来看一下HierarchicalBeanFactory,他在BeanFactory的基础上增加了两个函数,一个是用来获取父级BeanFactory的,一个是用来判断当前BeanFactory里是否包含指定名字的Bean(忽略其他的BeanFactory).这个接口是一个二级接口,从中我们可以看到Spring在设计时的两个理念,首先是工厂的分层,其次呢是将设置和获取分离,无论是容器的获取和设置还是说容器内的Bean的设置和获取都是如此.

       我们再来看ListableBeanFactory.这个接口扩展了BeanFactory,然后提供了对Bean的遍历枚举功能,他一下返回所有的Bean,不用像之前一样一个个地查找了。我们现在来看一下他的几个api.

     首先是第一组函数:

    1.getBeanDefinitionCount,用来返回工厂中的Bean的数目;

    2.containsBeanDefinition,用来检索工厂中是否包含某个Bean

    3.getBeanDefinitionNames,用来返回工厂中所有Bean的名称

       注意:但是呢,如果实现该接口的具体工厂本身是有层级的,比如同时实现了HierarchicalBeanFactory,那么这组函数无法使用.另外,如果说你的bean不是使用BeanDefinitions的形式而是使用其他形式定义并注册到工厂中的话,也会被这组函数给忽略.

 

       其次是第二组函数:

      1.getBeanNamesForType: 返回工厂中所有类型与给定类型一致的Bean的名字,包括了给定类型的子类或实现类

      2.getBeansOfType: 返回工厂中所有类型与给定类型一直的Bean的实例,包括了给定类型的子类和实现类

      注意:这组函数对于FactoryBean而言,他们是根据Bean Definition或者getObjectType的值来进行判断的.这组接口只能匹配到顶级的Bean,而内嵌的Bean即使与指定类型一致,也是没有办法匹配到的.并且因为FactoryBean在创建对象的时候会对对象进行初始化。因此由FactoryBean创建的对象,如果他们本身的类型不匹配,他们将使用FactoryBean再次进行匹配.与上一组一样,这组函数也不会考虑层级中的其他工厂,如果真想获取其他工厂内部的Bean,可以使用BeanFactoryUtils提供的beanNamesForTypeIncludingAncestors方法.getBeanNamesForType匹配所有类型的bean,包括单例、原生类型或者FactoryBean.在大多数实现中,getBeanNamesForType(ResolvableType type)的结果与getBeanNamesForType(true,true,true)的结果是一样的.该组函数不会忽略使用BeanDefinition以及其他方式注册的单例Bean,并且BeanName在返回的时候,总是按着顺序寻找最靠后的那一个BeanName来进行返回的.

       getBeanNamesForType(Class<?> type,boolean includeNonSingletons,boolean allowEagerInit).这个函数跟其他几个重载不太一样.在使用这个函数的时候,如果FactoryBean在创建对象时设置了”allowEagerInit”,那么FactoryBean创建的对象将首先按着对象本身的类型进行匹配,如果不一致将作为FactoryBean进行再次匹配.如果”allowEagerInit”没有被设置,则FactoryBean创建的对象将只被作为FactoryBean类型来进行匹配.(补充说明,以上两段内容同样适用于getBeansOfType).

 

       最后一组函数如下:

       getBeanNamesForAnnotation:这个函数是4.0开始引入的,主要用于寻找那些已经应用了注解,并且还没创建相应实例的Bean.对于那些由FactoryBean创建的对象,他们的类型则是在FactoryBean对其初始化的时候决定的.

       getBeansWithAnnotation:这个函数是3.0开始引入的,这个接口与上一个函数是互补的,他主要用于寻找那些也能管用了注解,并且已经创建了相应实例的Bean,返回的是Bean的名称和他们的实例.FactoryBean所创建的对象,处理方式与getBeanNameForAnnotation相同.

       findAnnotationOnBean:这个函数也是3.0开始引入的,主要用于寻找指定类上所具备的某一种特定的注解,如果给定的那个Bean没有,就会寻找给定bean的父类或者给定Bean所实现的接口上是否有某一种特定的注解.如果有,就返回.

       其实看到这里,我们就能够看到Spring对接口隔离原则的执着。在了解了这两个基本的接口之后呢,我们紧接着就可以了解这俩接口的默认实现DefaultListableBeanFactory.我们下次来分享.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值