//初始化 context 的信息源,和国际化有关
initMessageSource();
// 初始化 context 的專件传播器
ini tApplicationEventMulticaster();
//初始化其他子类特殊的 bean
onRefresh();
//检查并炷册事件监昕器
registerListeners();
//实例化所有非巅加裁单例
finishBeanFactoryInitialization(beanFactory);
//最后一步:发布对应事件
finishRefresh();
} catch (BeansException ex) {
// …
finally {
// …
}}}
在上面的代码中,调用 finishRefresh 方法初始化容器的生 命周期处理器并发布容器的生命周期事件之后,Spring 应用 上下文正式开启,Spring Boot 核心特性也随之启动。完成 refreshContext 方法操作之后,调用 afterRefresh 方 法。最新版本的 Spring Boot 中refreshContext 方法的实现默认为空,可由开发人员自行扩展,相关代码如下。
但需要注意的是,该方法在以往的版本中方法定义和实现差距较大,如果对此方法进行扩展,在升级版本时需特别留意。
protected void afterRefresh(ConfigurableApplicationContext context,
Applicat ionArguments args) {
//默认实现为空
}
完成以上操作之后,调用 SpringApplicationRun isteners 的 started 方法,通知监听器容器启动完成,并调用 ApplicationRunner 和 CommandL ineRunner 的运行方法。
调用 ApplicationRunner 和 CommandLineRunner
========================================
ApplicationRunner 和 CommandL ineRunner 是通过 SpringApplication 类的 callRunners方法来完成的,具体代码如下。
private void callRunners (ApplicationContext context, Applicat ionArguments a
rgs) {
List<0bject> runners = new ArrayList<>();
runners . addAll(context. getBeansOfType(ApplicationRunner. class). values());
runners . addAll(context . getBeansOfType(CommandL ineRunner . class).values());
AnnotationAwareOrderComparator. sort (runners);
for (Object runner : new LinkedHashSet<>(runners)) {
if (runner instanceof ApplicationRunner) {
callRunner((ApplicationRunner) runner, args);
}
if (runner instanceof Commandl ineRunner)
callRunner( (CommandL ineRunner) runner, args);
private void callRunner(ApplicationRunner runner, ApplicationArguments arg
s)i
try {
(runner). run(args);
} catch (Exception ex) {
throw new IllegalStateException(“Failed to execute ApplicationRunner”,
ex);
private void callRunner (CommandL ineRunner runner, ApplicationArguments arg
s) {
//内容与上面方法相同
}
}
以上代码,首先从 context 中获得类型为 ApplicationRunner 和 CommandLineRunner 的Bean, 将 它 们 放 入 List 列 表 中 并 进 行 排 序 。 然 后 再 遍 历 调 用 其 run 方 法 , 并 将ApplicationArguments 参数传入。
Spring Boot 提供这两个接口的目的,是为了我们在开发的过程中,通过它们来实现在容器启动时执行一-些操作,如果有多个实现类,可通过@Order 注解或实现 Ordered 接口来控制执行顺序。
这两个接口都提供了一个 run 方法,但不同之处在于: ApplicationRunner 中 run 方法的参数为 ApplicationArguments,而 CommandLineRunner 接口 中 run 方法的参数为 String 数组。
以上方法执行完成后,会通过 SpringApplicationRunListeners 的 running 方法通知监听器:
容器此刻已处于运行状态。至此,SpringApplication 的 run 方法执行完毕。
小结
==
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。
因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
也有C、小程序、Python等项目供你选择,真正体系化!**
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-ZTEhkLgC-1712535814917)]