下图为 ClassPathXmlApplicationContext 的类继承体系结构,虽然只有一部分,但是它基本上包含了 IoC 体系中大部分的核心类和接口:

java io流继承关系 java io继承体系图_spring


下面我们就针对这个图进行简单的拆分和补充说明。

1.Resource 体系

org.springframework.core.io.Resource,对资源的抽象。它的每一个实现类都代表了一种资源的访问策略,如 ClassPathResource、RLResource、FileSystemResource 等。

java io流继承关系 java io继承体系图_数据结构_02

2.ResourceLoader 体系

有了资源,就应该有资源加载,Spring 利用 org.springframework.core.io.ResourceLoader 来进行统一资源加载,主要应用于根据给定的资源文件地址,返回对应的 Resource 。

java io流继承关系 java io继承体系图_spring_03

3.BeanDefinition 体系

org.springframework.beans.factory.config.BeanDefinition ,用来描述 Spring 中的 Bean 对象。

java io流继承关系 java io继承体系图_java_04

4.BeanDefinitionReader 体系

org.springframework.beans.factory.support.BeanDefinitionReader 的作用是读取 Spring 的配置文件的内容,并将其转换成 Ioc 容器内部的数据结构 :BeanDefinition 。

java io流继承关系 java io继承体系图_java_05

5.BeanFactory 体系

org.springframework.beans.factory.BeanFactory,是一个非常纯粹的 bean 容器,它是 IoC 必备的数据结构,其中 BeanDefinition 是它的基本结构。BeanFactory 内部维护着一个BeanDefinition map ,并可根据 BeanDefinition 的描述进行 bean 的创建和管理。

其中 BeanFactory 作为最顶层的一个接口类,它定义了 IOC 容器的基本功能规范

public interface BeanFactory {
    // 对 FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,如果需要得到工厂本身,需要转义
    String FACTORY_BEAN_PREFIX = "&";

    // 根据 bean的名字,获取在IOC容器中得到bean实例
    Object getBean(String name) throws BeansException;
    // 根据 bean的名字和Class类型来得到 bean实例,增加了类型安全验证机制。
	<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
    Object getBean(String name, Object... args) throws BeansException;
    // 根据类型获取Bean
    <T> T getBean(Class<T> requiredType) throws BeansException;
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
    
    // 得到bean实例的Class类型
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    // 得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
	String[] getAliases(String name);

    // 提供对bean的检索,看看是否在IOC容器有这个名字的bean
    boolean containsBean(String name);
    
    // 根据 bean名字得到bean实例,并同时判断这个 bean是不是单例
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
}

java io流继承关系 java io继承体系图_资源加载_06

BeanFactory 有三个重要的子类:

  • ListableBeanFactory:表示这些 Bean是可列表化的
  • HierarchicalBeanFactory:表示的是这些 Bean是有继承关系的
  • AutowireCapableBeanFactory:定义Bean的自动装配规则

从类图中我们可以发现最终的默认实现类是 DefaultListableBeanFactory,它实现了所有的接口。

ApplicationContext是Spring 提供的一个高级的IOC 容器,它除了能够提供IOC 容器的基本功能外,还为用户提供了以下的附加服务:

  • 支持信息源,可以实现国际化。(实现MessageSource接口)
  • 访问资源。(实现ResourcePatternResolver接口,后面章节会讲到)
  • 支持应用事件。(实现ApplicationEventPublisher接口)

Spring 提供了许多IOC 容器的实现 。 比 如 GenericApplicationContext , ClasspathXmlApplicationContext 等 。