在 Spring 框架中,应用程序上下文(ApplicationContext) 是整个框架的核心容器,它负责管理对象的生命周期、依赖注入(DI)、组件扫描、事件发布等核心功能。它的作用可以概括为以下几个方面:
1. 对象管理与依赖注入
- Bean 定义与实例化:通过配置(XML/注解/Java 配置)定义
Bean
,并在运行时按需实例化。 - 依赖注入:自动将
Bean
的依赖关系(如其他Bean
、配置值、环境变量等)注入到目标对象中。 - 单例/多例控制:默认每个
Bean
是单例,也可显式配置为多例(Prototype)。
2. 组件扫描与自动装配
- 类路径扫描:自动发现并注册带有特定注解(如
@Component
,@Service
,@Repository
,@Controller
)的类作为Bean
。 - 自动装配:通过
@Autowired
或@Inject
注解自动解决Bean
之间的依赖关系。
3. 配置与扩展支持
- 支持多种配置方式:
- XML 配置(传统方式)
- 注解配置(如
@Configuration
,@Bean
) - Java 配置(基于
@Configuration
类) - 外部化配置(如
application.properties
或application.yml
)。
- 集成第三方库:通过
BeanPostProcessor
、BeanFactoryPostProcessor
等扩展接口自定义Bean
的生命周期行为。
4. 事件驱动编程
- 事件发布与监听:支持通过
ApplicationEventPublisher
发布事件,通过@EventListener
注解监听事件。 - 应用事件(ApplicationEvent):用于跨层通信(如服务层触发数据变化后通知UI层)。
5. 资源访问
- 提供统一的资源加载方式(如文件、URL、类路径资源),通过
ResourceLoader
接口实现。
6. 国际化(i18n)支持
- 管理
MessageSource
实现多语言资源文件的加载和解析。
7. 上下文生命周期管理
- 控制
Bean
的初始化(InitializingBean
的afterPropertiesSet
方法)和销毁(DisposableBean
的destroy
方法)。
ApplicationContext vs BeanFactory
特性 | ApplicationContext | BeanFactory |
---|---|---|
功能丰富性 | 支持所有 BeanFactory 功能 + 事件、AOP等 | 基础容器,仅提供核心的依赖注入功能 |
延迟加载 | 默认不延迟加载单例 Bean | 支持延迟加载 |
资源加载 | 内置资源加载器 | 需要手动实现 |
适用场景 | 生产环境推荐 | 学习或简单项目可能使用 |
常见 ApplicationContext 实现
类型 | 用途 |
---|---|
ClassPathXmlApplicationContext | 从类路径加载 XML 配置文件(传统方式) |
AnnotationConfigApplicationContext | 基于 Java 注解的配置(推荐现代开发) |
WebApplicationContext | Web 应用上下文(集成 Servlet 环境) |
FileSystemXmlApplicationContext | 从文件系统加载 XML 配置文件 |
示例代码(Java 配置)
java
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
// 启动上下文
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
MyService service = context.getBean(MyService.class);
service.doSomething();
}
}
总结
ApplicationContext 是 Spring 框件的“中枢神经”,贯穿整个应用生命周期,简化了开发复杂度。合理使用它可以实现松耦合、可维护的代码架构。