跟我读Spring——Spring源码浅析(一)

本文深入介绍了Spring框架中的核心接口,包括BeanFactory、ListableBeanFactory等,并解释了它们的功能及相互间的关系。此外,还详细阐述了核心接口的实现者及其应用场景。

我刚创建的群,欢迎加入Java一步一脚印

目录

Spring核心类介绍

核心接口

我们要学习Spring的源码,首先要从抽象层开始入手,下面介绍几个核心的接口。

首先是Spring的类结构图:

Spring类结构图

  • BeanFactory
    BeanFactory是Spring容器里最为重要的接口之一,这个接口作为访问Spring容器的根接口,定义为访问Spring Bean容器的基本的一个客户端视图。所有基于bean的操作都是基于这个接口来实现的,包括我们在J2EE开发中常用到的ApplicationContext接口也是从BeanFactory上继承而来的。

    子接口说明

    • ListableBeanFactory
      此接口为BeanFactory的扩展接口,主要实现了容器中所有bean的遍历方法,避免一个接一个按名字查找bean来遍历。

      boolean containsBeanDefinition(String beanName);
      int getBeanDefinitionCount();
      String[] getBeanDefinitionNames();
      String[] getBeanNamesForType(Class<?> type);
      String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
      <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
      
      //includeNonSingletons表示是否包含非singleton(单例)的bean
      //allowEagerInit表示是否为了内部的类型检查去初始化lazy-init的单例或由FactoryBean/factory-method等产生的bean,传递true会导致这些bean初始化。
      <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
                  throws BeansException;
      Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType)
                  throws BeansException;
      <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType);

      需要注意的是getBeansOfType和getBeanNamesForType都不支持内部类bean的获得。

    • HierarchicalBeanFactory
      此接口标识了这个BeanFactory可以有层次结构,意思即是可以有parentBeanFactory

      BeanFactory getParentBeanFactory();
      //表示是否在当前的BeanFactory里有这个bean,不在父容器或祖先容器等寻找
      boolean containsLocalBean(String name);
    • ConfigurableBeanFactory
      此接口提供了一系列配置BeanFactory的方法,需要注意的是一般情况下这个类型不应被外部使用,外部使用一般有BeanFactory和ListableBeanFactory就可以了。这个类型是Spring框架内部所使用的类型。

    • AutowireCapableBeanFactory
      此接口提供了一系列可以自动装配bean的方法,提供了对现有的bean实例操作自动装配的入口。
      这个接口不应当在一般的程序中使用,使用BeanFactory和ListableBeanFactory接口已经足够了。
      里面有几个常量,让我们看看:

      //不自动注入
      int AUTOWIRE_NO = 0;
      //通过名称自动注入
      int AUTOWIRE_BY_NAME = 1;
      //通过类型自动注入
      int AUTOWIRE_BY_TYPE = 2;
      //通过构造器自动注入
      int AUTOWIRE_CONSTRUCTOR = 3;
      //这个在spring3.0及以上版本已经废弃了,意思是自动推测。spring需要更明确的界定注入方式
      @Deprecated
      int AUTOWIRE_AUTODETECT = 4;
    • ConfigurableListableBeanFactory
      此接口被大多数可列举的(listable)BeanFactory所实现。它提供了分析和修改BeanDefinition的工具,还有提供一个单例bean实例化的预操作入口(pre-instantiate)。
      void preInstantiateSingletons() throws BeansException;
  • BeanDefinition
    一个BeanDefinition代表了一个bean实例的一个描述,可能有自己的属性、构造器及更多根据具体实现者的信息。简单的说就是一个bean的描述元数据接口。里面提供了各种bean的可配置信息,与xml的配置相应。

    子接口说明

    • AnnotationBeanDefinition
      此接口只是BeanDefinition的扩展,为了暴露相关的AnnotationMetaData 注解元数据给外部。
  • BeanDefinitionRegistry
    这个接口表示一个BeanDefinition的存储者,是读取解析配置文件成为BeanDefinition后,BeanDefinition的注册中心。这是在Spring里唯一的一个封装了BeanDefinition的注册方法的接口。
    已知的实现者是DefaultListableBeanFactory 和 GenericApplicationContext。

  • AliasRegistry
    一个公共的接口表示Spring里别名的管理注册器。BeanFactory的默认实现者DefaultListableBeanFactory就是一个
    别名注册中心(AliasRegistry)。

  • AutowireCandidateResolver
    确定一个bean是否有资格作为自动装配的候补者。

核心实现者

  • DefaultListableBeanFactory
    Spring框架中默认实现的BeanFactory,ListableBeanFactory和BeanDefinitionRegistry的默认实现者。官方的定义是

    a full-fledged bean factory based on bean definition objects.

    一个完全成熟的基于BeanDefinition对象的bean工厂。
    主要用途是在访问bean之前注册所有的BeanDefinition(可能来自于bean的配置文件)。因此在本地表中查找BeanDefinition是一个耗费不大的操作。

  • SimpleAliasRegistry
    一个别名注册中心的简单实现,它同时是DefaultListableBeanFactory的祖先类

  • DefaultSingletonBeanRegistry
    一般的共享实例(单例)的bean注册中心,允许注册单例的bean实例。需要注意的是它同时提供了 DisposableBean的实现者bean的注册,可能这个DisposableBean的实现者并不是单例。它会根据一个合理的关闭顺序来注册bean的相关依赖。

  • FactoryBeanRegistrySupport
    此类是DefaultSingletonBeanRegistry的子类,主要功能是增加了FactoryBean的注册支持。

  • AbstractBeanFactory
    BeanFactory的最基本的抽象实现,此类提供了一个单例的缓存,同时也提供了管理BeanFactory的层次结构。主要的模板方法实现是getBeanDefinition和createBean,前者是通过一个给定的BeanDefinition的名称来得到一个BeanDefinition对象,而后者是通过一个BeanDefinition来创建这个bean的实例。

  • RootBeanDefinition
    一个根bean的定义,表示一个在Spring BeanFactory运行时合并特定的bean后的定义。它可能被创建为合并互相继承的一些原始的bean定义,一般这些原始的bean定义表示为GenericBeanDefinition。这个类在本质上是运行时标准的BeanDefinition的表示。

  • ChildBeanDefinition
    一个表示从父定义中继承而来的子Bean的定义。一个子bean定义将继承构造器参数值,属性值, 和方法的重载定义(MethodOverride),factory-method/init-method/destroy-method如果被定义了,子bean将覆盖父bean的定义。而剩下的这些属性是子bean自己的:depends-on, autowire, dependency-check, singleton, lazy-init

  • GenericBeanDefinition
    一个一站式的(one-stop)bean定义类。通常来说,用这个类是为了把一个BeanDefinition暴露给用户,可能在post-processor周期使用到,甚至可能改变它的一些属性。而使用RootBeanDefinition和ChildBeanDefinition是为了更明确的表示父子关系。

  • BeanDefinitionHolder
    一个BeanDefnition的存储器,主要是为了保存bean name和一个或多个别名之间的映射。

  • XmlBeanDefinitionReader
    BeanDefinition的XML方式读取器,具体的操作委托给了BeanDefinitionDocumentReader
  • DefaultBeanDefinitionDocumentReader
    读取spring-beans里bean定义的读取器,支持DTD和Schema。里面的定义结构属性等都是硬编码的。
  • BeanDefinitionParserDelegate
    用于parse bean定义的委托类,注意这个类是有状态的。
  • ResourceLoader
    一个加载Resource的策略接口定义,可能这个资源是classpath下的或者是文件系统里的。
  • XmlBeanFactory
    DefaultListableBeanFactory的一个扩展,用于从xml文件里读取BeanDefinition。委托给了XmlBeanDefinitionReader,如果你用DefaultListableBeanFactory同时里面使用XmlBeanDefinitionReader是一样的效果。

    本文结束,概念介绍了这么多,下面的章节将读具体的代码逻辑了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值