一、ApplicationContext 概述
ApplicationContext 是 Spring Framework 中最核心的接口之一,位于 org.springframework.context 包下。它代表了 Spring 的 IoC(控制反转)容器,负责管理应用中的所有 Bean 及其依赖关系。
二、ApplicationContext 的继承体系
BeanFactory (基础容器功能)
↑
ListableBeanFactory (扩展列举功能)
↑
HierarchicalBeanFactory (支持层级结构)
↑
MessageSource (国际化支持)
↑
ApplicationEventPublisher (事件发布)
↑
ResourcePatternResolver (资源加载)
↑
EnvironmentCapable (环境配置)
↑
ApplicationContext (综合接口)
三、核心功能
1. Bean 管理功能
-
Bean 的创建、配置和组装
-
Bean 生命周期的管理
-
依赖注入的实现
2. 资源访问
Resource resource = context.getResource("classpath:config.properties");
3. 国际化支持
String message = context.getMessage("msg.key", null, Locale.CHINA);
4. 事件发布机制
context.publishEvent(new CustomEvent(context, "Some event"));
5. 环境配置访问
String profile = context.getEnvironment().getProperty("spring.profiles.active");
四、常用实现类
1. ClassPathXmlApplicationContext
ApplicationContext context =
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
2. FileSystemXmlApplicationContext
ApplicationContext context =
new FileSystemXmlApplicationContext("C:/config/applicationContext.xml");
3. AnnotationConfigApplicationContext
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
4. WebApplicationContext (Web 应用专用)
// 通常在 web.xml 中配置 ContextLoaderListener
五、核心方法详解
1. Bean 相关方法
// 获取 Bean 实例
Object getBean(String name) throws BeansException;
// 按类型获取 Bean
<T> T getBean(Class<T> requiredType) throws BeansException;
// 检查是否存在 Bean
boolean containsBean(String name);
2. 环境相关方法
// 获取环境配置
Environment getEnvironment();
// 获取应用名称
String getApplicationName();
3. 父容器相关
// 获取父容器
ApplicationContext getParent();
// 设置父容器
void setParent(ApplicationContext parent);
六、ApplicationContext 的生命周期
-
初始化阶段:
-
加载配置元数据
-
创建 Bean 定义注册表
-
初始化 BeanFactory 后置处理器
-
-
Bean 实例化阶段:
-
实例化单例 Bean
-
处理依赖注入
-
调用初始化回调
-
-
运行阶段:
-
处理请求
-
发布事件
-
响应变化
-
-
销毁阶段:
-
调用销毁回调
-
释放资源
-
七、与 BeanFactory 的区别
| 特性 | BeanFactory | ApplicationContext |
|---|---|---|
| Bean 实例化时机 | 延迟初始化 | 启动时预初始化单例 Bean |
| 国际化支持 | 不支持 | 支持 |
| 事件发布机制 | 不支持 | 支持 |
| 自动注册 | 不支持 BeanPostProcessor 自动注册 | 支持 |
| 性能 | 轻量级,启动快 | 功能全面但启动稍慢 |
八、高级特性
1. 层次化容器
ApplicationContext parent = new ClassPathXmlApplicationContext("parent.xml");
ApplicationContext child = new ClassPathXmlApplicationContext(new String[]{"child.xml"}, parent);
2. 环境抽象
ConfigurableEnvironment env = new StandardEnvironment();
env.setActiveProfiles("dev");
context.setEnvironment(env);
3. 资源模式解析
Resource[] resources = context.getResources("classpath*:META-INF/*.xml");
九、最佳实践
-
在 Web 应用中:
-
使用
ContextLoaderListener初始化根应用上下文 -
使用
DispatcherServlet初始化子应用上下文
-
-
在测试中:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class MyTest {
@Autowired
private ApplicationContext context;
}
3.在普通 Java 应用中:
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
// 使用 context...
}
}
十、常见问题解决方案
1. 循环依赖问题
-
使用 setter 注入代替构造器注入
-
使用
@Lazy注解延迟初始化
2. 多配置文件加载
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"config1.xml", "config2.xml"});
3. 环境切换
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.getEnvironment().setActiveProfiles("dev");
context.register(AppConfig.class);
context.refresh();
十一、总结
ApplicationContext 是 Spring 框架的核心容器,相比基础的 BeanFactory 提供了更多企业级功能。理解 ApplicationContext 的工作原理和各种实现类的特点,对于开发 Spring 应用程序至关重要。它不仅管理着应用中的所有组件,还提供了资源访问、国际化、事件发布等一系列基础设施支持,是 Spring 框架强大功能的基础。


3966

被折叠的 条评论
为什么被折叠?



