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)。
为什么要拆成这么多的类和接口呢。这里面可能基于几点考虑?
- 功能的不同维度,分不同的接口,方便维护和阅读。如:AutowireCapableBeanFactory、ListableBeanFactory、HierarchicalBeanFactory 等
- 不同接口的实现,分布在不同的之类里,方便不同接口多种实现的扩展
- 从整个类图的分布,可以看出 Spring 是面向接口编程,后面类的实现,是接口功能实现的一种,随时可以拓展成多种实现
ApplicationContext
ApplicationContext 基于 BeanFactory 增加了更多支持企业级功能支持。
ApplicationContext 常用实现类
- AnnotationConfigApplicationContext,从一个或多个基于 Java 的配置类中加载上下文定义,适用于 Java 注解的方式。
- ClassPathXmlApplicationContext,从类路径下的一个或多个 xml 配置文件中加载上下文定义,适用于 xml 配置的方式。
- FileSystemXmlApplicationContext,从文件系统下的一个或多个 xml 配置文件中加载上下文定义,也就是说系统盘符中加载 xml 配置文件。
- AnnotationConfigWebApplicationContext,专门为 Web 应用准备的,适用于注解方式。
- XmlWebApplicationContext,从 Web 应用下的一个或多个 xml 配置文件加载上下文定义,适用于 xml 配置方式。
Spring 具有非常大的灵活性,提供了三种主要的装配机制:
- 在 XML 中进行显示配置
- 在 Java 中进行显示配置
- 隐式的 bean 发现机制和自动装配
*组件扫描(component scanning):Spring 会自动发现应用上下文中所创建的 Bean。
*自动装配(autowiring):Spring 自动满足 Bean 之间的依赖。
优先级:3>2>1
尽可能地使用自动配置的机制,显示配置越少越好。当必须使用显示配置 Bean 的时候(如:有些源码不是由开发者来维护的,而需要为这些代码配置 Bean 的时候),推荐使用类型安全比 XML 更加强大的 JavaConfig。只有当你想要使用便利的 XML 命名空间,并且在 JavaConfig 中没有同样的实现时,才使用 XML。