下图为 ClassPathXmlApplicationContext 的类继承体系结构,虽然只有一部分,但是它基本上包含了 IoC 体系中大部分的核心类和接口:
下面我们就针对这个图进行简单的拆分和补充说明。
1.Resource 体系
org.springframework.core.io.Resource
,对资源的抽象。它的每一个实现类都代表了一种资源的访问策略,如 ClassPathResource、RLResource、FileSystemResource 等。
2.ResourceLoader 体系
有了资源,就应该有资源加载,Spring 利用 org.springframework.core.io.ResourceLoader
来进行统一资源加载,主要应用于根据给定的资源文件地址,返回对应的 Resource 。
3.BeanDefinition 体系
org.springframework.beans.factory.config.BeanDefinition
,用来描述 Spring 中的 Bean 对象。
4.BeanDefinitionReader 体系
org.springframework.beans.factory.support.BeanDefinitionReader
的作用是读取 Spring 的配置文件的内容,并将其转换成 Ioc 容器内部的数据结构 :BeanDefinition 。
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;
}
BeanFactory 有三个重要的子类:
- ListableBeanFactory:表示这些 Bean是可列表化的
- HierarchicalBeanFactory:表示的是这些 Bean是有继承关系的
- AutowireCapableBeanFactory:定义Bean的自动装配规则
从类图中我们可以发现最终的默认实现类是 DefaultListableBeanFactory,它实现了所有的接口。
ApplicationContext是Spring 提供的一个高级的IOC 容器,它除了能够提供IOC 容器的基本功能外,还为用户提供了以下的附加服务:
- 支持信息源,可以实现国际化。(实现MessageSource接口)
- 访问资源。(实现ResourcePatternResolver接口,后面章节会讲到)
- 支持应用事件。(实现ApplicationEventPublisher接口)
Spring 提供了许多IOC 容器的实现 。 比 如 GenericApplicationContext , ClasspathXmlApplicationContext 等 。