一、简介
ApplicationContext 是Spring框架中的一个核心接口,它是Spring IoC容器的实现之一,用于管理和组织应用程序中的各种Bean,同时提供了一系列功能来支持依赖注入、AOP等特性。
简单来说,ApplicationContext 是一个大型的、高级的Spring IoC容器,它扩展了BeanFactory接口,提供了更多的功能和特性,比如事件传播、国际化支持、资源加载、生命周期回调等。
二、特性和功能
下面是ApplicationContext的一些重要特性和功能:
- Bean管理:ApplicationContext负责管理应用程序中的所有Bean,包括实例化、配置、装配和生命周期管理等。
- 依赖注入:通过ApplicationContext可以实现依赖注入(DI),即自动将依赖关系注入到相应的Bean中,避免硬编码依赖关系,提高代码的灵活性和可维护性。
- AOP支持:ApplicationContext提供了对面向切面编程(AOP)的支持,可以通过配置切面和通知来实现横切关注点的模块化和重用。
- 事件传播:ApplicationContext支持事件传播机制,可以在容器中发布和监听事件,实现模块之间的解耦和通信。
- 国际化支持:ApplicationContext提供了对国际化和本地化的支持,可以方便地处理多语言和不同地区的资源。
- 资源加载:ApplicationContext可以加载和管理各种类型的资源,包括文件、类路径资源、URL等,方便应用程序进行资源访问和管理。
- 生命周期管理:ApplicationContext管理Bean的生命周期,包括初始化、销毁等过程,可以通过配置来控制Bean的生命周期行为。
- 容器扩展:ApplicationContext是一个可扩展的容器,可以通过自定义扩展点来增加和定制容器的功能和行为。
ApplicationContext 是Spring框架中最重要的组件之一,它提供了一个全面的、集成的环境,帮助开发者管理和组织应用程序中的各种组件,并提供了丰富的功能来支持应用程序的开发和运行。
三、源码分析
这段代码是Spring Boot中 SpringApplication 类的 run
方法的部分代码,主要是用于启动Spring Boot应用程序并创建 ApplicationContext 的过程。比较重要的几个步骤:
StopWatch stopWatch = new StopWatch();
stopWatch.start();
创建一个计时器,用于计算整个启动过程的时间。
DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
创建一个默认的引导上下文对象,用于启动过程中的一些操作。
SpringApplicationRunListeners listeners = this.getRunListeners(args); listeners.starting(bootstrapContext, this.mainApplicationClass);
获取应用程序的运行监听器,并在启动前通知这些监听器应用程序即将启动。
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
创建应用程序参数对象,用于传递命令行参数。
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
准备应用程序的环境,包括配置文件的加载、属性的解析等操作。
context = this.createApplicationContext();
创建应用程序的上下文,即ApplicationContext对象。
this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
准备应用程序的上下文,包括设置资源加载器、注册Bean后处理器等操作。
this.refreshContext(context);
刷新应用程序的上下文,启动容器并加载Bean。
this.afterRefresh(context, applicationArguments);
刷新后的处理,包括注册shutdown hook等操作。
四、加上注解后的源码
// 启动Spring Boot应用程序并返回ApplicationContext对象
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch(); // 创建计时器
stopWatch.start(); // 开始计时
DefaultBootstrapContext bootstrapContext = this.createBootstrapContext(); // 创建默认的引导上下文
ConfigurableApplicationContext context = null; // 初始化ApplicationContext对象
this.configureHeadlessProperty(); // 配置系统属性
SpringApplicationRunListeners listeners = this.getRunListeners(args); // 获取运行监听器
listeners.starting(bootstrapContext, this.mainApplicationClass); // 通知监听器应用程序即将启动
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args); // 创建应用程序参数对象
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments); // 准备应用程序环境
this.configureIgnoreBeanInfo(environment); // 配置忽略Bean信息
Banner printedBanner = this.printBanner(environment); // 打印Banner
context = this.createApplicationContext(); // 创建ApplicationContext对象
context.setApplicationStartup(this.applicationStartup); // 设置应用程序启动方式
this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner); // 准备应用程序上下文
this.refreshContext(context); // 刷新应用程序上下文
this.afterRefresh(context, applicationArguments); // 刷新后的处理
stopWatch.stop(); // 停止计时器
if (this.logStartupInfo) {
(new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch); // 记录启动信息
}
listeners.started(context); // 通知监听器应用程序已经启动
this.callRunners(context, applicationArguments); // 执行命令行Runner任务
} catch (Throwable var10) {
this.handleRunFailure(context, var10, listeners); // 处理运行失败
throw new IllegalStateException(var10); // 抛出异常信息
}
try {
listeners.running(context); // 通知监听器应用程序正在运行
return context; // 返回ApplicationContext对象
} catch (Throwable var9) {
this.handleRunFailure(context, var9, (SpringApplicationRunListeners)null); // 处理运行失败
throw new IllegalStateException(var9); // 抛出异常信息
}
}
这段代码是Spring Boot应用程序的启动过程中的核心代码,涉及了配置环境、加载Bean、执行监听器、打印Banner、记录启动信息等一系列操作,最终返回一个配置完成的ApplicationContext对象用于后续应用程序的运行。