暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring源码分析之重要接口继承体系(上)

Alleria Windrunner 2020-10-02
635
前面几篇我们一起实现了一个简单的Spring框架,主要梳理了一下Spring加载配置文件并创建bean实例的过程。关于Spring源码中重要的接口主要有以下几个:
  1. BeanFactory

  2. BeanDefinition

  3. ApplicationContext


BeanFactory是Spring中创建bean实例的接口,BeanDefinition接口是对配置文件中bean定义的抽象,ApplicationContext是Spring中重要的上下文类。本篇我们就一起来分析一下BeanFactory接口的继承体系。


BeanFactory

首先我们来看BeanFactory,其继承体系类图如下所示:

接口从整体上看分为了四层:
  1. BeanFactory

  2. ListableBeanFactory、AutowireCapableBeanFactory、HierachicalBeanFactory

  3. ConfigurableBeanFactory

  4. ConfigurableListableBeanFactory



BeanFactory为最顶层的接口提供了获取bean,判断是否包含bean,是否单例与原型,获取bean类型等api。示意图及主要代码如下:


ListableBeanFactory

从名字上面看我们就大概能猜出来这是一个提供了遍历bean实例方法的接口.当然,工厂并没有直接提供返回所有实例的方法,也没这个必要。它可以返回指定类型的所有的实例。而且你可以通过 getBeanDefinitionNames()得到工厂所有bean的名字,然后根据这些名字得到所有的Bean。这个工厂接口扩展了 BeanFactory的功能,作为上文指出的BeanFactory二级接口,有9个独有的方法,扩展了跟BeanDefinition的功能,提供了BeanDefinition、BeanName、注解有关的各种操作。示意图及主要代码如下:


HierarchicalBeanFactory

这个工厂接口非常简单,实现了Bean工厂的分层。这个工厂接口也是继承自BeanFacotory,也是一个二级接口,相对于父接口,它只扩展了一个重要的功能。示意图及主要代码如下:


AutowireCapableBeanFactory

这个工厂接口继承自BeanFacotory,它扩展了自动装配的功能,根据类定义BeanDefinition装配Bean、执行前、后处理器等。


ConfigurableListableBeanFactory

工厂接口 ConfigurableListableBeanFactory 同时继承了3个接口, ListableBeanFactory 、 AutowireCapableBeanFactory 和 ConfigurableBeanFactory,扩展之后,加上自有的这8个方法,这个工厂接口总共有83个方法,实在是巨大到不行了。这个工厂接口的自有方法总体上只是对父类接口功能的补充,包含了 BeanFactory 体系目前的所有方法,可以说是BeanFactory接口的集大成者。
    public interface ConfigurableListableBeanFactory extends ListableBeanFactoryAutowireCapableBeanFactory,ConfigurableBeanFactory {  
    void ignoreDependencyType(Class<?> type);
    //忽略自动装配的依赖类型
    void ignoreDependencyInterface(Class<?> ifc);
    //忽略自动装配的接口
    /*
    * 注册一个可分解的依赖
         */    
        void registerResolvableDependency(Class<?> dependencyType, ObjectautowiredValue);  
        /*   
         * 判断指定的Bean是否有资格作为自动装配的候选者 
         */    
    boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;
    // 返回注册的Bean定义
    BeanDefinition getBeanDefinition(String beanName) throwsNoSuchBeanDefinitionException;
    // 暂时冻结所有的Bean配置
    void freezeConfiguration();
    // 判断本工厂配置是否被冻结
    boolean isConfigurationFrozen();
    // 使所有的非延迟加载的单例类都实例化。
    void preInstantiateSingletons() throws BeansException;
    }

    BeanDefinitionRegistry

    这是一个内部接口,主要作用是用来操作定义在工厂内部的BeanDefinition的。
      public interface BeanDefinitionRegistry extends AliasRegistry {  
      // 给定bean名称,注册一个新的bean定义
      void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;
      /*
           * 根据指定Bean名移除对应的Bean定义 
           */    
          void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;  
          /*   
           * 根据指定bean名得到对应的Bean定义 
           */    
          BeanDefinition getBeanDefinition(String beanName) throwsNoSuchBeanDefinitionException;  
          /*   
           * 查找,指定的Bean名是否包含Bean定义 
      */
          boolean containsBeanDefinition(String beanName);  
          String[] getBeanDefinitionNames();
      //返回本容器内所有注册的Bean定义名称
      int getBeanDefinitionCount();
      //返回本容器内注册的Bean定义数目
      boolean isBeanNameInUse(String beanName);
          //指定Bean名是否被注册过。
      }
      好了,关于Bean工厂接口的分析就这些了。
      文章转载自Alleria Windrunner,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论