Spring源码解析-ioc容器的设计

Spring源码解析-ioc容器的设计

1 IoC容器系列的设计:BeanFactory和ApplicatioContext

  在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本的功能;

另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。

  应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境作了许多适配。这两个容器系列,就基本满足用户对IoC容器使用的大部分需求了。

1.1 Spring的IoC容器系列

  我们通常说的IoC容器,实际上代表着一系列功能各异的容器产品,是指容器的功能有大有小,有各自的特点。

  在IoC容器的接口定义和实现的基础之上,Spring通过BeanDefinition来管理基于Spring的应用中的各种对象以及它们之间的相互依赖关系。BeanDefinition抽象了我们对Bean的定义,是让容器起作用的主要数据类型。

1.2 Spring IoC容器的设计

  IoC容器的接口设计图:

  1.第一条接口设计主线

    从BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是一条主要的BeanFactory的BeanFactory设计路径。在这条设计路径中,BeanFactory定义了基本IoC容器的规范。在这个接口定义中,包括了像getBean()这样的IoC容器的基本方法。而HierarchicalBeanFactory接口在继承了BeanFactory基本接口之后,增加了getParentBeanFactory()的接口功能,使BeanFactory具备了双亲IoC容器的配置功能。而在接下来的ConfigurableBeanFactory接口中,定义了一些对BeanFactory的配置功能,比如通过setParentBeanFactory()设置双亲IoC容器,通过addBeanPostProcessor()配置Bena后置处理器等等。通过这些接口设计的叠加,定义了BeanFactory就是简单IoC容器 的基本功能。

  2.第二条接口设计主线

    以ApplicationContext应用上下文接口为核心的接口设计,这里涉及到设计到的接口主要有,从BeanFactory到ListableBeanFactory,再到ApplicationContext,再到我们常见的WebApplicationContext或者ConfigurableApplicationContext接口。在这个接口体系中,ListableBeanFactory和HierarchicalBeanFactory两个接口,连接BeanFactory接口定义和ApplicationContext应用上下文的接口定义。在ListableBeanFactory接口中,细化了许多BeanFactory的接口功能,比如定义了getBeanDefinitionNames()接口方法;对于ApplicationContext接口,它通过继承MessageSource、ResourceLoader、ApplicationEventPublisher接口,在BeanFactory简单容器中添加了许多对高级容器的特性支持。

  这里设计的是主要的接口关系,而具体的IoC容器都是在这个接口体系下实现的,比如DefaultListableBeanFactory,这个基本IoC容器就是实现了ConfigurableBeanFactory,从而成为一个精简的IoC容器的实现。像其他IoC容器,比如XmlBeanFactory,都是在DefaultListableBeanFactory的基础上做扩展,同样的,ApplicationContext的实现也是如此。

  这个接口系统是以BeanFactory和ApplicationContext为核心的。而BeanFactory又是IoC容器的最基本接口,在ApplicationContext的设计中,一方面可以看到它继承了BeanFactory接口体系中的ListableBeanFactory、AutowireCapableBeanFactory、HierarchicalBeanFactory等BeanFactory的接口,具备了BeanFactory IoC容器的基本功能;另一方面通过继承MseeageSource、ResourceLoader、ApplicationEventPublisher这些接口,具备了更高级的IoC容器特性。对于ApplicationContext而言,为了在Web环境下使用它,还设计了WebApplicationContext接口,这个接口通过继承ThemeSource接口来扩充。

猜你喜欢

转载自www.cnblogs.com/tc971121/p/12024269.html