ApplicationContext类继承设计

先上类图:
ApplicationContext类继承设计_第1张图片
BeanFactory是Spring IoC的核心接口,BeanFactory相关的类设计可以看做是Spring的核心骨骼,为整个框架设计了一个基本的核心架构。但只有骨骼,没有血肉,也是不完整的,这样一个核心的骨架难以在实际开发中应用,毕竟在实际企业开发中,还涉及到许多额外的功能,例如:资源加载,消息源处理,事件机制,生命周期管理等等。这些非业务的,公用的又必不可少的功能,不可能由开发者每次去开发,因此Spring提供了ApplicationContext体系。它扩展了BeanFactory,并且提供了实际开发应用中需要的一系列高级特性,主要包括:

  1. 支持不同的消息源,ApplicationContext扩展了MessageSource,使Spring得以处理国际化信息,为开发多语言版本的应用提供服务。
  2. 访问资源。 这个特性体现在对是ResourceLoader和ResourcePatternResolver的支持上,这样我们可以从不同的地方得到定义Bean的资源。这样,可以灵活的定义bean定义信息,例如从不通的IO途径或者网络资源来得到Beans定义信息
  3. 支持应用事件,获得事件响应功能。ApplicationEventPublisher拥有发布事件功能,为Spring引入事件机制。
  4. 生命周期管理(Lifecycle),运行环境设置(EnvironmentCapable)

ApplicationContext实现类设计。
AbstractApplicationContext是对ApplicationContext的一个简单抽象实现。它并没有指定beans的配置策略,它实现了一些ApplicationContext的通用方法,在设计它时,使用了模板方法设计模式,对于某些方法需要在具体的子类中实现。

AbstractApplicationContext有两大子类GenericApplicationContext和AbstractRefreshableApplicationContext。GenericApplictionContext及其子类持有一个单例的固定的DefaultListableBeanFactory实例,在创建GenericApplicationContext实例的时候就会创建DefaultListableBeanFactory实例。固定的意思就是说,即使调用refresh方法,也不会重新创建BeanFactory实例。与之对应的就是AbstractRefreshableApplicationContext,它实现了所谓的热刷新功能,它内部也持有一个DefaultListableBeanFactory实例,每次刷新refresh()时都会销毁当前的BeanFactory实例并重新创建DefaultListableBeanFactory实例。

我们常用的ClassPathXmlApplicationContext和FileSystemXmlApplicationContext都是AbstractRefreshableApplicationContext的子类。

你可能感兴趣的:(Spring源码解析)