Spring5源码浅析(一)--BeanFactory

       Spring广受欢迎的两大特性是IOC和AOP。IOC是Spring所提供的容器技术,主要用来维护系统中的组件的实例化.而容器中最基本的就是BeanFactory.BeanFactory的结构如下所示:

        BeanFactory是Spring体系中的一个最基本最底层的容器,并且跟我们平时所用的不太相同,我们平时在使用一些小型容器,比如Map或Set或List的时候,或者说我们在提供一种数据结构的时候总是把数据的变动操作与数据的获取操作放在一起提供,但是Spring呢,他的基本容器只提供了获取组件的操作.

       通过上图我们可以看到,BeanFactory的诸多方法里主要分为两类,首先是获取组件的,主要分为以下三类:

  1. 根据组件名称来获取
  2. 根据组件类型来获取
  3. 根据组件名称或类型并加上构造函数的参数来获取一个Bean

     其次是一些服务性的接口:

  1. 判断指定名称的Bean是否是单例
  2. 判断指定的Bean是否匹配指定的类型
  3. 判断是否是单例
  4. 获取Bean的类型
  5. 获取Bean的别名

      研究到这里的时候,其他的都还好,但有两个东西让我很不解,首先我不知道ResolvableType是干嘛的,其次,我不知道ObjectProvider是干嘛的.

       现在我们来细聊一下ResolvableType.在BeanFactory中,关于ResolvableType的函数有两个,一个是用来获取BeanProvider的,这个我们等会儿说,一个是判断类型是否匹配的.那ResolvableType到底是什么呢?ResolvableType是从Spring4.0开始引入的.看官方文档,我们会发现ResolvableType是对Java类型的一个封装,这个东西被提供是为了方便我们进行泛型操作。既然是泛型,我们都知道泛型的目的是通用,并且呢能在具体的环境中得到具体的类型.这个方法被提供,与getBeanProvider(Class<T> requiredType)进行配合,既可以指定一个具体的ObjectProvider类型,又可以指定一个通用的ObjectProvider类型.

        现在我们来看一下ObjectProvider,在BeanFactory里出现的getBeanProvider是从5.1之后开始引入的.而ObjectProvider这个接口呢,则是4.3开始就有的. 通过接口的结构,我们知道ObjectProvider接口是ObjectFactory的一个扩展和增强接口.ObjectFactory是用来产生类的对象的.ObjectProvider在ObjectFactory的基础上增加了一些更友好的函数,如下图所示:

       在4.3之前,如果我们的依赖注入是通过构造函数进行注入的,那么必须要显示的使用@Autowired这个注解来进行标注,当然像@Configuration类,历来是不支持构造函数注入的,这种情况从4.3以后开始发生转变,Spring引入了隐式注入,这样我们就再也不用在构造函数上写@Autowired了,并且@Configuration类也支持构造函数注入了.但隐式注入是强依赖的,如果依赖的对象不存在,就会抛出异常报错.

      针对这种情况,4.3特意推出了ObjectProvider,ObjectProvider的getIfAvaiable()和getIfUnique()就是针对bean进行过滤的.

      回到BeanFactory,这里的getBeanProvider就是为了获取指定Bean的FactoryBean.说到这里,多给大家提一句,BeanFactory和FactoryBean是完全不同的,BeanFactory是一系列规范,而FactoryBean则是这些规范的具体实现.

      关于BeanFactory的分享就到这里,如果大家有什么补充的或者有哪些可以修正的,可以发邮件[email protected]或者直接留言,欢迎大家多多提宝贵的意见.

猜你喜欢

转载自blog.csdn.net/jacob_earl/article/details/85275548