Spring Context 解析

BeanFactory 和 ApplicationContext

BeanFactory 和 ApplicationContext 是 Spring 的两大核心接口,其中 ApplicationContext 是 BeanFactory 的子接口,都可以当做 Spring 的容器。Spring 容器是生成 Bean 实例的工厂,并管理容器中的 Bean。在基于 Spring 的应用程序中,所有的组件都被当成 Bean 处理。一般称 BeanFactory 为 IoC 容器,称 ApplicationContext 为应用上下文。

BeanFactory

BeanFactory 负责配置、创建、管理 Bean,同时还管理着 Bean 之间的依赖关系。真正可以作为一个可以独立使用的 IoC 容器是 DefaultListableBeanFactory(BeanFactory 和 ApplicationContext 都是接口)。

BeanFactory

提供获取 Bean,是否包含 Bean,是否单例或原型,获取 Bean 类型、别名的方法 。最主要的方法就是 getBean(String beanName)。

BeanFactory 的三个子接口:

  • HierarchicalBeanFactory:提供父容器的访问功能,实现 BeanFactory 的父子关系
  • ListableBeanFactory:实现 Bean 的 list 集合操作功能
  • AutowireCapableBeanFactory:实现 Bean 的自动装配功能

ConfigurableBeanFactory

继承 HierarchicalBeanFactory 的基础上,实现 BeanFactory 的全部配置管理功能,提供单例 Bean 的注册接口(SingletonBeanRegistry)

ConfigurableListableBeanFactory

继承了上述的所有接口,增加了其他功能:类加载器、类型转化、属性编辑器、BeanPostProcessor、作用域、Bean 定义、处理 Bean 依赖关系、管理 Bean 如何销毁等。

DefaultListableBeanFactory

实现了 ConfigurableListableBeanFactory、BeanDefinitionRegistry(注册 BeanDefinition)、AbstractAutowireCapableBeanFactory(实现接口 AutowireCapableBeanFactory,并继承类 AbstractBeanFactory)。

为什么要拆成这么多的类和接口呢。这里面可能基于几点考虑?

  1. 功能的不同维度,分不同的接口,方便维护和阅读。如:AutowireCapableBeanFactory、ListableBeanFactory、HierarchicalBeanFactory 等
  2. 不同接口的实现,分布在不同的之类里,方便不同接口多种实现的扩展
  3. 从整个类图的分布,可以看出 Spring 是面向接口编程,后面类的实现,是接口功能实现的一种,随时可以拓展成多种实现

ApplicationContext

ApplicationContext 基于 BeanFactory 增加了更多支持企业级功能支持。

ApplicationContext 常用实现类

  • AnnotationConfigApplicationContext,从一个或多个基于 Java 的配置类中加载上下文定义,适用于 Java 注解的方式。
  • ClassPathXmlApplicationContext,从类路径下的一个或多个 xml 配置文件中加载上下文定义,适用于 xml 配置的方式。
  • FileSystemXmlApplicationContext,从文件系统下的一个或多个 xml 配置文件中加载上下文定义,也就是说系统盘符中加载 xml 配置文件。
  • AnnotationConfigWebApplicationContext,专门为 Web 应用准备的,适用于注解方式。
  • XmlWebApplicationContext,从 Web 应用下的一个或多个 xml 配置文件加载上下文定义,适用于 xml 配置方式。

Spring 具有非常大的灵活性,提供了三种主要的装配机制:

  1. 在 XML 中进行显示配置
  2. 在 Java 中进行显示配置
  3. 隐式的 bean 发现机制和自动装配

*组件扫描(component scanning):Spring 会自动发现应用上下文中所创建的 Bean。
*自动装配(autowiring):Spring 自动满足 Bean 之间的依赖。
优先级:3>2>1

尽可能地使用自动配置的机制,显示配置越少越好。当必须使用显示配置 Bean 的时候(如:有些源码不是由开发者来维护的,而需要为这些代码配置 Bean 的时候),推荐使用类型安全比 XML 更加强大的 JavaConfig。只有当你想要使用便利的 XML 命名空间,并且在 JavaConfig 中没有同样的实现时,才使用 XML。


Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注