Spring 的 ApplicationContext 是整个 IoC 容器的核心,它不仅是一个 Bean 工厂,还是一个 资源管理器、事件发布器、国际化处理器 等。
之所以功能如此丰富,原因就在于 ApplicationContext 实现了大量接口,每个接口都在不同的阶段和场景下发挥作用。
一、ApplicationContext 的接口体系
主要接口可以分为以下几类:
-
IoC 核心接口
BeanFactoryListableBeanFactoryHierarchicalBeanFactoryConfigurableApplicationContext
-
资源与环境接口
ResourceLoaderResourcePatternResolverEnvironmentCapable
-
上下文扩展接口
ApplicationEventPublisherMessageSourceLifecycleCloseable/AutoCloseable
二、接口详解与应用场景
1. BeanFactory(IoC 的核心)
-
作用:最基础的 IoC 容器接口,定义了
getBean()等获取 bean 的方法。 -
关键方法:
Object getBean(String name)boolean containsBean(String name)
-
场景:
- 所有
ApplicationContext最基础的能力就是能从容器里拿到 bean。 - 这是在 运行时阶段 最常用的接口。
- 所有
2. ListableBeanFactory
-
作用:在
BeanFactory的基础上,支持一次性获取多个 bean。 -
关键方法:
String[] getBeanDefinitionNames()<T> Map<String, T> getBeansOfType(Class<T> type)
-
场景:
- 框架级功能常用,比如 Spring 自动配置时,会批量查找某类 bean。
- 应用开发中也常见,如获取所有实现某接口的 bean 来做策略模式。
3. HierarchicalBeanFactory
-
作用:支持父子容器(Parent-Child Context)结构。
-
关键方法:
BeanFactory getParentBeanFactory()
-
场景:
- Web 应用常见:
RootApplicationContext+DispatcherServlet子容器。 - 父容器里放服务层,子容器里放 Web 层 bean。
- Web 应用常见:
4. ConfigurableApplicationContext
-
作用:扩展
ApplicationContext,提供刷新、关闭等操作。 -
关键方法:
void refresh()—— 初始化容器void close()—— 关闭容器
-
场景:
- 启动阶段,Spring Boot 的
SpringApplication.run()内部调用refresh()。 - 停止阶段,关闭容器时触发 bean 的销毁。
- 启动阶段,Spring Boot 的
5. ResourceLoader
-
作用:提供统一的资源加载能力。
-
关键方法:
Resource getResource(String location)
-
支持格式:
classpath:...file:...http:...
-
场景:
- Spring XML 配置加载
- @PropertySource 加载配置文件
- 开发中读取 classpath 下的文件
6. ResourcePatternResolver
-
作用:在
ResourceLoader的基础上,支持通配符批量加载资源。 -
关键方法:
Resource[] getResources(String locationPattern)
-
场景:
classpath*:META-INF/spring.factories—— Spring Boot 自动装配机制依赖此功能。
7. EnvironmentCapable
-
作用:提供访问
Environment的能力。 -
关键方法:
Environment getEnvironment()
-
场景:
- 获取配置属性(application.properties / application.yml)
- 访问系统环境变量、JVM 参数
- Profile 激活(
@Profile("dev"))
8. ApplicationEventPublisher
-
作用:事件发布机制的核心接口。
-
关键方法:
void publishEvent(ApplicationEvent event)
-
场景:
- Spring 内部事件(ContextRefreshedEvent、ContextClosedEvent 等)
- 自定义事件:微服务中组件解耦(下单后发布事件,监听器处理库存、通知等)
9. MessageSource
-
作用:提供国际化(i18n)支持。
-
关键方法:
String getMessage(String code, Object[] args, String defaultMessage, Locale locale)
-
场景:
- 国际化文案管理
- 错误提示、校验消息本地化
10. Lifecycle
-
作用:控制容器生命周期。
-
关键方法:
void start()void stop()boolean isRunning()
-
场景:
- 在某些应用场景下按需启停容器(IoT、批处理任务)。
11. Closeable / AutoCloseable
-
作用:与 Java 规范接轨,支持容器关闭。
-
关键方法:
void close()
-
场景:
- Spring Boot 的
SpringApplication退出时关闭容器,触发 bean 的destroy-method。
- Spring Boot 的
三、生命周期中的接口作用映射
结合 Spring 的初始化过程,我们把接口放到不同阶段来看:
| 阶段 | 接口 | 作用 |
|---|---|---|
| 创建容器 | ConfigurableApplicationContext | 调用 refresh() 启动容器 |
| 加载 BeanDefinition | ResourceLoader / ResourcePatternResolver | 加载 XML、注解配置 |
| 注册 BeanDefinition | BeanDefinitionRegistry(间接实现) | 存放元数据 |
| 实例化 Bean | BeanFactory / ListableBeanFactory | 提供依赖查找、依赖注入 |
| 容器事件 | ApplicationEventPublisher | 发布生命周期事件 |
| 运行中 | EnvironmentCapable | 访问配置与 Profile |
| 多容器结构 | HierarchicalBeanFactory | 父子容器管理 |
| 国际化 | MessageSource | 处理多语言文案 |
| 销毁阶段 | Lifecycle / Closeable | 容器关闭、bean 销毁 |
四、为什么要这么设计?
-
单一职责原则
每个接口负责一类功能(资源加载、事件发布、bean 管理),避免“大一统”接口。 -
解耦与扩展性
框架内部和用户都可以面向接口编程,自定义实现也能挂上来。 -
契合不同使用场景
- 企业级应用需要事件机制(
ApplicationEventPublisher)。 - 国际化系统需要
MessageSource。 - 云原生/微服务需要环境感知(
EnvironmentCapable)。
- 企业级应用需要事件机制(
五、总结
ApplicationContext是 Spring 的 多接口复合体,核心职责是 IoC 容器,但同时承担了资源管理、事件机制、国际化等企业级特性。- 每个接口都有明确的职责,分别在 初始化、运行、扩展、销毁 阶段起作用。
- 理解这些接口的设计,可以帮助我们更好地理解 Spring 的解耦思想,也能指导我们在实际开发中做扩展(比如自定义事件、环境切换、多容器架构)。